03-22-2010 07:25 AM
03-22-2010 11:58 AM
03-23-2010 07:31 AM
public class SubirDocServiceSkeleton {
public Store storeRef;
public String puntoCodigo;
AuthenticationUtils atu;
private AuthenticationDetails autDet;
private String[] usupass;
private alfrescoHelper alfhelp;
private String alfEnp;
private String alfEnpDavUp;
private String app;
private String procedimiento;
private String campana;
private String mes;
private String exp;
private String doc;
private String nombreFicDav;
private String prefix;
private String tipo;
private String modelo;
public synchronized juntadeandalucia.cap.alfws.alfrescotype._1._0.PeticionSubidaReturnType procesarSubida(
juntadeandalucia.cap.alfws.alfrescotype._1._0.PeticionSubidaType peticionSubidaType) {
app = peticionSubidaType.getApp();
tipo = peticionSubidaType.getTipo();
modelo = peticionSubidaType.getModelo();
prefix = peticionSubidaType.getPrefix();
procedimiento = peticionSubidaType.getProcedimiento();
campana = peticionSubidaType.getCampana();
mes = peticionSubidaType.getMes();
exp = peticionSubidaType.getExp();
doc = peticionSubidaType.getDoc();
nombreFicDav = peticionSubidaType.getNombreFicDav();
PeticionSubidaReturnType respuesta = new PeticionSubidaReturnType();
this.alfhelp = new alfrescoHelper();
String respHelp = this.alfhelp.conectarAlfresco(app);
this.storeRef = this.alfhelp.getStoreRef();
this.usupass = this.alfhelp.getUsuPassAlf();
//Se comprueba el usuario tiene permisos para gestionar en alfresco.
puntoCodigo = "método procesaSubida. Comprobación aplicación usuaria";
if (respHelp.equals("OK")){
puntoCodigo = "método procesaSubida. Comprobación aplicación usuaria correcta";
//0.-
/******************************************************************************************
// Se comprueba la existencia del documento que se quiere subir.
* Si existe se mandara un mensaje al usuario advirtiendolo y se parara la ejecución.
* Se comprueba si existe la estructura de espacios que se necesita para
* guardar el documento a subir.
* Si no existe la estructura, se creará.
*/
// 0.1.- Primero comprobamos la existencia del documento
puntoCodigo = "metodo procesarSubida. Apartado 0.1";
PeticionListaType plt = new PeticionListaType();
plt.setApp(app);
plt.setModelo(modelo);
plt.setPrefix(prefix);
plt.setTipoDoc(tipo);
plt.setProcedimiento(procedimiento);
plt.setCampana(campana);
plt.setMes(mes);
plt.setExpediente(exp);
plt.setDocumento(doc);
plt.setParametros(peticionSubidaType.getParametros());
Documento[] docs = new ListaDocsServiceSkeleton().ejecutaBusqueda(plt, false,this.alfhelp).getDocArray();
if (!Arrays.equals(docs, null)) {
for (int i = 0; i < docs.length; i++) {
String ret;
ret = "El documento que intenta insertar ya existe en el repositorio: \n";
ret = ret + " ID del nodo donde esta el Documento " + (i + 1) + " \n" + " " + docs[i].getIdAlfresco() + " \n";
ret = ret + " Ruta fisica del nodo donde está el documento " + (i + 1) + " \n" + " " + docs[i].getRuta() + " \n";
ret = ret + " Nombre del documento " + (i + 1) + " \n" + " " + docs[i].getNombre();
respuesta.setRespuestaSubida(ret);
this.alfhelp.desconectarAlfresco();
return respuesta;
}
}
// 0.2.- Si el procedimiento insertado pertenece a la aplicacion usuaria
puntoCodigo = "metodo procesarSubida. Apartado 0.2";
if (this.alfhelp.checkProced(app, procedimiento)) {
puntoCodigo = "metodo procesarSubida. Apartado 0.2. El procedimiento " + procedimiento + " pertenece a la sistema " + app;
} else {
puntoCodigo = "metodo procesarSubida. Apartado 0.2. El procedimiento " + procedimiento + " NO pertenece a la sistema " + app;
try {
throw new Exception("El procedimiento " + procedimiento + " no corresponde al sistema " + app);
} catch (Exception ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, puntoCodigo + "\n" + ex);
respuesta.setRespuestaSubida(puntoCodigo + "\n" + ex.getMessage());
return respuesta;
}finally{
this.alfhelp.desconectarAlfresco();
}
}
// 0.3.- Si el documento no existe en el repositorio empezamos a comprobar los espacios
puntoCodigo = "metodo procesarSubida. Apartado 0.3";
String nodoDav = this.alfhelp.getOrgSisApp(app) + "/P_" + procedimiento + "/C_" + campana + "/M_" + mes + "/EXP_" + exp + "/" + doc;
String rutaNodo = nodoDav.replaceAll("/", "/cm:");
rutaNodo = "/app:company_home/cm:" + rutaNodo;
String resultadoComprobacion = creacionEspacios(nodoDav,rutaNodo);
if (resultadoComprobacion.equals("")){
}else{
respuesta.setRespuestaSubida(resultadoComprobacion);
this.alfhelp.desconectarAlfresco();
return respuesta;
}
// fin de la comprobacion de existencia de espacios
/******************************************************************************************/
try {
String nombreDoc = nombreFicDav;
nombreDoc = nombreDoc.replaceAll(" ", "_");
//1.0.-PROPIEDADES ########################################################################
/******************************************************************************************
// Comprobamos que las propiedades pasadas por parametros coinciden con las necesarias para
// el tipo de documento que queremos subir a Alfresco
*/
puntoCodigo = "metodo procesarSubida. Apartado 1.0. Comprobación de las propiedades pasadas por parámetros";
ListaPropDocServiceSkeleton lista = new ListaPropDocServiceSkeleton();
PeticionPropType ppt = new PeticionPropType();
ppt.setApp(app);
ppt.setModelo(modelo);
ppt.setPrefix(prefix);
ppt.setTipo(tipo);
lista.listaPropDoc(ppt,false,this.alfhelp);
DescPropTipoDoc[] propiedadesTipoDoc = null;
propiedadesTipoDoc = lista.getPropiedadesTipoDoc();
Datos[] metad = peticionSubidaType.getParametros().getDatArray();
boolean estaProp = false;
boolean hayProp = false;
if (metad.length > 0) {
hayProp = true;
}
for (int i = 0; i < metad.length; i++) {
String propiedadPasada = Constants.createQNameString(modelo, metad[i].getPropiedad());
estaProp = false;
for (int j = 0; j < propiedadesTipoDoc.length; j++) {
String propiedadModelo = propiedadesTipoDoc[j].getNombreProp();
if (propiedadModelo.equals(propiedadPasada)) {
estaProp = true;
break;
}
}
if (!estaProp) {
throw new Exception("La propiedad " + propiedadPasada + " no esta disponible para el tipo de documento " + tipo);
}
}
// fin de la comprobacion
/******************************************************************************************/
//2.0.- SUBIDA DEL DOCUMENTO ################################################################
/******************************************************************************************/
puntoCodigo = "metodo procesarSubida. Apartado 2.0. Llamada a ejecutaSubidaDav";
/* Ejecutamos la subida del fichero */
ejecutaSubidaDav(this.usupass[0], this.usupass[1], peticionSubidaType.getFichero(), nodoDav, nombreDoc, this.alfhelp.getEndpointAlfDav());
/* Fin de la ejecución de la subida */
//Creamos una referencia al documento que hemos subido
Reference ref = new Reference(this.storeRef, null,/*refDoc*/ rutaNodo + "/cm:" + nombreDoc);
/******************************************************************************************/
//3.- EJECUCIÓN DE ACCIÓN PARA CAMBIO DE TIPO ########################################
/******************************************************************************************/
/* Se ejecuta una accion para asignar el tipo de documento indicado por parametros al
documento que se acaba de subir por WebDav.*/
ejecutaAccion(ref);
// Fin de la ejecución de la acción
/******************************************************************************************/
//4.- ASPECTO Y METADATOS CORRESPONDIENTES #############################################
/******************************************************************************************/
/* Se añaden la propiedades por medio de aspectos */
ejecutaPropiedades(ref,metad);
// Fin de la asignación de propiedades
/******************************************************************************************/
respuesta.setRespuestaSubida("Documento insertado en Alfresco con exito.");
return respuesta;
} catch (RepositoryFault ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, puntoCodigo + "\n" + ex);
ex.printStackTrace();
respuesta.setRespuestaSubida(puntoCodigo + "\n" + "Error de repositorio.");
return respuesta;
} catch (RemoteException ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, puntoCodigo + "\n" + ex);
ex.printStackTrace();
respuesta.setRespuestaSubida(puntoCodigo + "\n" + "Error de invocación remota.");
return respuesta;
} catch (IOException ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, puntoCodigo + "\n" + ex);
ex.printStackTrace();
respuesta.setRespuestaSubida(puntoCodigo + "\n" + "Error en el Entrada/Salida.");
return respuesta;
} catch (Exception ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, puntoCodigo + "\n" + ex);
respuesta.setRespuestaSubida(puntoCodigo + "\n" + ex.getMessage());
return respuesta;
} finally {
//finaliza sesion
this.alfhelp.desconectarAlfresco();
}
} else {
respuesta.setRespuestaSubida(respHelp + ". método procesaSubida. Comprobación aplicación usuaria incorrecta. \nNo tiene permiso para hacer gestiones en Alfresco");
return respuesta;
}
}
private synchronized String creacionEspacios(String nodoDav, String rutaNodo) {
puntoCodigo = "metodo procesarSubida. Apartado 0.3";
// Función split para los espacios sin el prefijo cm:
String[] nodos1 = nodoDav.split("/");
String integerNoValido = this.alfhelp.checkAnnoMesExp(nodos1[3], nodos1[4], nodos1[5]);
if (!integerNoValido.equals("")) {
return "El valor que ha introducido para el espacio " + integerNoValido + " a la longitud adecuada";
}
// Función split para lo espacios con el prefijo cm:
String[] nodos2 = rutaNodo.split("/");
// Por defecto estarán creados los nodos de sistema y procedimiento
String nodoPpal = "/" + nodos2[1] + "/" + nodos2[2] + "/" + nodos2[3];
// Compruebo los espacios a partir de la 3ª posicion de la cadena sin prefijos cm:.
// Se comprueba a partir de la 3ª por que los dos primeros espacios corresponden a
// sistema/procedimiento que estarán creados por defecto.
String nodoAComprobar = nodoPpal;
for (int i = 2; i < nodos1.length; i++) {
// Construyo la ruta que sera necesaria para crear la ParentReference y posteriormente
// añado el nuevo subespacio a comprobar
String nodoPadre = nodoAComprobar;
nodoAComprobar = nodoAComprobar + "/cm:" + nodos1[i];
if (this.alfhelp.checkSpace(nodoAComprobar/*, this.storeRef, this.alfEnp, this.autDet*/)) {
puntoCodigo = "metodo procesarSubida. Apartado 0.3. Comprobacion de espacios. Existe el espacio";
//TODO para posible uso futuro. Comprobar que existe el fichero
//en la misma ruta donde estamos intentando subir y ejecutar las
//acciones que se describan
/*if (i == nodos1.length -1){
//alfHelp.checkSpace(nodoAComprobar + "/cm:" + nombreFicDav , storeRef, alfEnp, autDet);
}*/
} else {
puntoCodigo = "metodo procesarSubida. Apartado 0.3. Comprobacion de espacios. No existe el espacio";
try {
// Crear la referencia al padre del espacio a crear
ParentReference parentReference = new ParentReference(this.storeRef, null, nodoPadre, Constants.ASSOC_CONTAINS, Constants.createQNameString(Constants.NAMESPACE_CONTENT_MODEL, nodos1[i]));
// Crear el espacio
NamedValue[] properties = new NamedValue[]{Utils.createNamedValue(Constants.PROP_NAME, nodos1[i])};
CMLCreate create = new CMLCreate("1", parentReference, null, null, null, Constants.TYPE_FOLDER, properties);
CML cml = new CML();
cml.setCreate(new CMLCreate[]{create});
WebServiceFactory.getRepositoryService().update(cml);
} catch (RemoteException ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, puntoCodigo + "\n" + ex);
return "No se ha podido crear la carpeta…";
}
}
}
return "";
}
private synchronized void ejecutaAccion(Reference ref){
try {
puntoCodigo = "metodo procesarSubida. Apartado 3.0. Ejecución de la acción para asignar el tipo de documento";
Predicate pred = new Predicate(new Reference[]{ref}, ref.getStore(), null);
Action[] ac1 = new Action[1];
ac1[0] = new Action();
ac1[0].setActionReference(ref);
ac1[0].setActionName("specialise-type");
NamedValue[] matriz = new NamedValue[1];
matriz[0] = Utils.createNamedValue("type-name", Constants.createQNameString(modelo, tipo));
ac1[0].setParameters(matriz);
WebServiceFactory.getActionService().executeActions(pred, ac1);
} catch (RemoteException ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, ex);
}
}
private synchronized void ejecutaPropiedades(Reference ref, Datos[] metadatos) {
puntoCodigo = "metodo procesarSubida. Apartado 4.0. Añadiendo los metadatos al documento";
Predicate predicate = new Predicate(new Reference[]{ref}, null, null);
NamedValue[] propiedades = new NamedValue[metadatos.length];
for (int i = 0; i < metadatos.length; i++) {
propiedades[i] = Utils.createNamedValue(Constants.createQNameString(modelo, metadatos[i].getPropiedad()), metadatos[i].getValor());
}
puntoCodigo = "metodo procesarSubida. Apartado 4.0. Creando el objeto de adición de aspecto";
CMLAddAspect asp = new CMLAddAspect(Constants.createQNameString(modelo, metadatos[0].getGrupo()), propiedades, predicate, "");
// Construct CML Block
CML cml = new CML();
cml.setAddAspect(new CMLAddAspect[]{asp});
// Executamos el CML Block
puntoCodigo = "metodo procesarSubida. Apartado 4.0. Ejecución de la actualizacion de propiedades";
try {
WebServiceFactory.getRepositoryService().update(cml);
} catch (RemoteException ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* Subida de un fichero a la ruta especificada
* <p>
* @param usu. Usuario para el recurso webdav
* @param pass. Password para el recurso webdav
* @param ficheroURL. Ruta del fichero en local.
* @param nodo. Es la ruta donde se subira el fichero en el repositorio de Alfresco
* @param nomFic. El nombre que recibirá el documento en Alfresco
* @param endP. El endpoint de Webdav para Alfresco (http://servidor:puerto/alfresco/webdav/).
*/
private synchronized void ejecutaSubidaDav(String usu, String pass, DataHandler ficheroURL, String nodo, String nomFic, String endP) {
puntoCodigo = "metodo ejecutaSubidaDav.";
try {
nomFic = nomFic.replaceAll(" ", "_");
String rutaPut = endP + "/" + nodo + "/" + nomFic; //+ "?ticket=" + this.alfhelp.getAutDet().getTicket();
// Escribe el contenido
HttpClient client = new HttpClient();
Credentials creds = new UsernamePasswordCredentials(usu, pass);
client.getState().setCredentials(AuthScope.ANY, creds);
PutMethod method = new PutMethod(rutaPut);
RequestEntity requestEntity = new InputStreamRequestEntity(ficheroURL.getInputStream()/*bis*/);
method.setRequestEntity(requestEntity);
puntoCodigo = "metodo ejecutaSubidaDav. Llamada executeMethod de PutMethod webDav";
client.executeMethod(method);
System.out.println(method.getStatusCode() + " " + method.getStatusText());
} catch (HttpException ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, puntoCodigo + "\n" + ex);
ex.printStackTrace();
} catch (FileNotFoundException ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, puntoCodigo + "\n" + ex);
ex.printStackTrace();
} catch (IOException ex) {
Logger.getLogger(SubirDocServiceSkeleton.class.getName()).log(Level.SEVERE, null, puntoCodigo + "\n" + ex);
ex.printStackTrace();
} finally {
puntoCodigo = "metodo ejecutaSubidaDav. Bloque finaly de la subida";
}
}
}
/**
*
* @author fastolfi
*/
public class alfrescoHelper {
private static ResourceBundle rb = ResourceBundle.getBundle("utilAlf.conexApps");
private AuthenticationDetails autDet;
private Store storeRef;
private AuthenticationUtils atu;
private AuthenticationServiceLocator asl;
private AuthenticationServiceSoapBindingStub autser;
private AuthenticationResult autres;
private String puntoCodigo;
private String[] usupass;
private String alfEnp;
public alfrescoHelper() {
}
@SuppressWarnings("static-access")
private synchronized void autenticarAlfresco(String user, String pass, String endP, int accion) {
puntoCodigo = "metodo autenticarAlfresco en alfrescoHelper";
if (accion == 1) {
try {
WebServiceFactory.setEndpointAddress(endP);
atu = new AuthenticationUtils();
atu.startSession(user, pass);
autDet = atu.getAuthenticationDetails();
System.out.println("ID de SESION: " + autDet.getSessionId());
System.out.println(" Ticket de Sesion " + autDet.getTicket());
storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
} catch (AuthenticationFault ex) {
Logger.getLogger(alfrescoHelper.class.getName()).log(Level.SEVERE, null, puntoCodigo + "\n" + ex);
System.out.println("Error al auntenticar en el modulo de subida en " + puntoCodigo);
ex.printStackTrace();
}
} else {
System.out.println("Terminando sesion con ID: " + autDet.getTicket());
atu.endSession();
}
}
@SuppressWarnings("static-access")
public synchronized String conectarAlfresco(String app) {
if (compruebaAppUsuaria(app)) {
usupass = getUsuPassAlf();
alfEnp = getEndpointAlf();
autenticarAlfresco(usupass[0], usupass[1], alfEnp, 1);
return "OK";
} else {
return "KO. Aplicacion no permitida";
}
}
public synchronized void desconectarAlfresco() {
autenticarAlfresco(null, null, null, 2);
}
}
03-23-2010 08:03 AM
Lo que no entiendo es que si yo le digo a cada hilo que establezca una nueva conexión, ¿porque no pueden seguir si cada uno tiene la suya?.Porque cuando otro hilo va a realizar la operación, la sesión quedó deshabilitada para ese usuario al terminar el primero. Lo ideal es que realices una sola autenticacion y la utilices para todos los hilos. Una vez realizada la operacion de "vuelco masivo" cierras sesión.
Creo que mi problema esta en que no entiendo bien la gestion de sesiones y tickets de alfresco.
03-23-2010 08:48 AM
03-23-2010 09:39 AM
¿como consigo detectar si queda algún hilo en ejecución?ese es el quid de la cuestión, siento no poder ayudarte en estos momentos ya que entre mi poca experiencia al respecto (tengo compis que son verdaderos gurús en J2EE) y el tiempo del que dispongo poco puedo aportar.
1.- Lo hice por WebDav por que me encontraba con limitación a la hora de subir ficheros de gran tamaño mediante webservice, yAlgo escuche en su momento del tema de problemas con ficheros "grandes" desde webservices, así que, tu planteamiento me parece correcto a priori ( y como dices, bajo presion hay menos margen para hacer las cosas como a todos nos gustaría ).
2.- Tuve que establecer las propiedades despues porque no encontré forma de subirlo por WebDav y a la vez asignarle el tipo y las propiedades. En fin, en programacion cuando las cosas funcionan con presión, ya sabemos todos que hay que buscar soluciones alternativas para ir mejorandolas poco a poco.
03-23-2010 10:24 AM
07-02-2010 05:47 AM
<!–activacion de la funcion de cacheo de adjuntos–>
<parameter name="cacheAttachments">true</parameter>
<!–directorio donde se encuentra la carpeta para los ficheros que se esten cacheando–>
<parameter name="attachmentDIR">..\webapps\axis2\WEB-INF\cache</parameter>
<!–tamaño en bytes por fichero que permitira axis2 que se suba sin cacheo–>
<parameter name="sizeThreshold">4000</parameter>
07-13-2010 02:59 PM
Tags
Find what you came for
We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.