git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Mon, 22 Jan 2018 15:14:07 +0000 (15:14 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Mon, 22 Jan 2018 15:14:07 +0000 (15:14 +0000)
50 files changed:
server/-configuration/deploy-test-bkup-mediacube-modules.launch [new file with mode: 0644]
server/-configuration/log4j2.xml
server/-configuration/mediacube-auth.properties [new file with mode: 0644]
server/-configuration/run-mediacube-server-bsh.launch
server/-configuration/scheduledjobs.json
server/-modules/pom.xml
server/-product/mediacube.product
server/-product/pom.xml
server/user.commons.log4j2/src/user/commons/log4j2/appender/HTMLMailAppender.java
server/user.commons.log4j2/src/user/commons/log4j2/appender/SmtpManager.java
server/user.jobengine.executors/LogCollector.java [new file with mode: 0644]
server/user.jobengine.executors/META-INF/MANIFEST.MF
server/user.jobengine.executors/jobtemplates/copyforarchive-nexio-recordings.xml [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/ArchiveListBuilderStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIORecordingsStep.java [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/FakeNoParamsStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/FakeStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/MetadataTransformStep.java
server/user.jobengine.osgi.commons/META-INF/MANIFEST.MF
server/user.jobengine.osgi.commons/src/user/commons/CalendarUtils.java
server/user.jobengine.osgi.commons/src/user/commons/ListUtils.java
server/user.jobengine.osgi.commons/src/user/commons/octopus/IOctopusAPI.java
server/user.jobengine.osgi.commons/src/user/commons/octopus/OctopusAPI.java
server/user.jobengine.osgi.commons/test/user/commons/TestMediaCubeMarker.java [new file with mode: 0644]
server/user.jobengine.osgi.db/META-INF/MANIFEST.MF
server/user.jobengine.osgi.db/test/user/jobengine/db/TestBase.java
server/user.jobengine.osgi.db/test/user/jobengine/db/TestItem.java
server/user.jobengine.osgi.server/.settings/org.eclipse.core.resources.prefs
server/user.jobengine.osgi.server/META-INF/MANIFEST.MF
server/user.jobengine.osgi.server/index.jsp
server/user.jobengine.osgi.server/pages/joblist.zul
server/user.jobengine.osgi.server/pages/login.jsp
server/user.jobengine.osgi.server/pages/login.zul [new file with mode: 0644]
server/user.jobengine.osgi.server/pages/menu.zul
server/user.jobengine.osgi.server/pages/search_items.zul
server/user.jobengine.osgi.server/pages/statistics.zul
server/user.jobengine.osgi.server/src/user/jobengine/server/steps/ArchiveItem.java
server/user.jobengine.osgi.server/src/user/jobengine/server/steps/LogCollector.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/server/steps/deploy-steps-to-bsh.launch [moved from server/user.jobengine.executors/deploy-steps-to-bsh.launch with 100% similarity]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/LineFeedConverter.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/LoginModel.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MenuModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/SearchModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/util/ADHandler.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/util/AdminAuthInitiator.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/util/AuthInitiator.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/util/LDAPHandler.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/util/SessionUtil.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/util/UserPrincipal.java [new file with mode: 0644]
server/user.jobengine.osgi.services/META-INF/MANIFEST.MF

diff --git a/server/-configuration/deploy-test-bkup-mediacube-modules.launch b/server/-configuration/deploy-test-bkup-mediacube-modules.launch
new file mode 100644 (file)
index 0000000..ed06cb2
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">\r
+<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>\r
+<stringAttribute key="M2_GOALS" value="clean deploy -Dremote.address=scp://root:password@10.10.1.29 -Dremote.location=/opt/test-mediacube"/>\r
+<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>\r
+<booleanAttribute key="M2_OFFLINE" value="false"/>\r
+<stringAttribute key="M2_PROFILES" value=""/>\r
+<listAttribute key="M2_PROPERTIES"/>\r
+<stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>\r
+<booleanAttribute key="M2_SKIP_TESTS" value="false"/>\r
+<intAttribute key="M2_THREADS" value="1"/>\r
+<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>\r
+<stringAttribute key="M2_USER_SETTINGS" value=""/>\r
+<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>\r
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">\r
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>\r
+</listAttribute>\r
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}/-modules"/>\r
+</launchConfiguration>\r
index f6606e9115481cfb3f21efeed79b8c1db401427b..b576e7da9434b1675c2a9dd863d0273d6ea59084 100644 (file)
@@ -19,7 +19,7 @@
                        </Filters>\r
                        <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L) %n" />\r
                </Console>\r
-               <HTMLMailAppender name="MarkeredMail" subject="MediaCube rendszerüzenet" to="vasary@elgekko.net" from="mediacubeserver@gmail.com" smtpHost="smtp.gmail.com"\r
+               <HTMLMailAppender name="MarkeredMail" subject="TEST MediaCube rendszerüzenet" to="vasary@elgekko.net" from="mediacubeserver@gmail.com" smtpHost="smtp.gmail.com"\r
                        smtpPort="465" smtpProtocol="smtps" smtpUsername="mediacubeserver@gmail.com" smtpPassword="salabakter" ignoreExceptions="false" bufferSize="1">\r
                        <Filters>\r
                                <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
@@ -47,7 +47,7 @@
                        <AppenderRef ref="Console" />\r
                        <AppenderRef ref="MarkeredConsole" />\r
 <!--                   <AppenderRef ref="RollingFile" /> -->\r
-<!--                   <AppenderRef ref="MarkeredMail" /> -->\r
+                       <AppenderRef ref="MarkeredMail" />\r
                </Root>\r
                <Logger name="org.zkoss" level="trace" additivity="false" />\r
                <Logger name="org.quartz" level="ERROR" additivity="false" />\r
diff --git a/server/-configuration/mediacube-auth.properties b/server/-configuration/mediacube-auth.properties
new file mode 100644 (file)
index 0000000..ec8d364
--- /dev/null
@@ -0,0 +1,9 @@
+#Archívum felület hitelesítés \r
+auth_enabled=true\r
+ad_host=10.10.254.11\r
+ad_nonsecureport=3268\r
+ad_base_dn=DC=intra,DC=echotv,DC=hu\r
+ad_admin_map=G_ECH_U_INFORMATIKUSOK,G_ECH_U_MUSZAKVEZETOK,ECH-ISILON-ADMINS\r
+local_users=user:password\r
+local_admins=root:password\r
+local_jobsubmitters=lebony:lebony
\ No newline at end of file
index 9a02b73714de397b081e5bef44f87d5483029eb0..164f27ee53c9dfe1cd1a73cd3e5737729eebe4d3 100644 (file)
@@ -19,9 +19,9 @@
 <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>\r
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/user/jobengine/server/steps&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Dnexio.host=10.10.1.55&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=test-rundowns&#13;&#10;-Djobengine.octopus.storyfolders.name=test-storyfolders&#13;&#10;-Djobengine.octopus.stories.name=test-stories"/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/user/jobengine/server/steps&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Dnexio.host=10.10.1.55&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=rundowns&#13;&#10;-Djobengine.octopus.storyfolders.name=storyfolders&#13;&#10;-Djobengine.octopus.stories.name=stories&#13;&#10;-Dmediacube.auth.location=&quot;${workspace_loc}/-configuration/mediacube-auth.properties&quot;"/>\r
 <stringAttribute key="pde.version" value="3.3"/>\r
-<booleanAttribute key="show_selected_only" value="false"/>\r
+<booleanAttribute key="show_selected_only" value="true"/>\r
 <stringAttribute key="target_bundles" value="cglib@default:default,com.auth0.java-jwt@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.google.guava@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,com.sun.el.javax.el@default:default,commons-logging@default:default,javassist@default:default,javax.annotation-api@default:default,javax.inject@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.servlet.jsp-api@default:default,javax.validation.api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.jasper.glassfish@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jdt.core.compiler.batch@default:default,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jsp@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.jvnet.mimepull@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.reflections@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
 <booleanAttribute key="tracing" value="false"/>\r
 <booleanAttribute key="useCustomFeatures" value="false"/>\r
index 092f719ce889047c7f45b921e8d16d4d70fd9399..403db8ebeb7c370ecb8a161df1a9fe95fc88fa39 100644 (file)
       ]\r
        },      \r
        {\r
+      "active": false,\r
+         "name" : "NEXIO rögzített anyagok másolása az ISILON/ARCHIVE mappába",\r
+      "template": "copyforarchive-nexio-recordings.xml",\r
+      "executeimmediate": true,\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "nexioPort", "value": 2098, "type": "java.lang.Integer"},\r
+       {"name": "nexioUserName", "value": "administrator", "type": "java.lang.String"},\r
+       {"name": "nexioPassword", "value": "system", "type": "java.lang.String"},\r
+       {"name": "archiveFtp", "value": "ftp://10.10.1.100/ARCHIVE/TEST", "type": "java.lang.String"},\r
+       {"name": "archiveUserName", "value": "mediacube", "type": "java.lang.String"},\r
+       {"name": "archivePassword", "value": "Broadca5T", "type": "java.lang.String"},\r
+       {"name": "agencies", "value": "schedule-rec", "type": "java.lang.String"},\r
+       {"name": "limit", "value": 10, "type": "java.lang.Integer"},\r
+       {"name": "nexioKillDateDays", "value": 7, "type": "java.lang.Integer"},\r
+       {"name": "nexioAgency", "value": "ARCHIVED", "type": "java.lang.String"}\r
+      ]\r
+       },      \r
+       {\r
       "active": false,\r
          "name" : "TRAFFIC anyagok visszatöltése",\r
       "template": "retrieve-traffic-missing-materials.xml",\r
index 1c58fc6c9b4eff967f958e9e60ba27744a346827..7a85d6cb5ebed30edfc6923d8177390f12113ab1 100644 (file)
 <!--                                   <target>1.8</target> -->\r
 <!--                           </configuration> -->\r
 <!--                   </plugin> -->\r
+\r
+                       <plugin>\r
+                               <groupId>org.apache.maven.plugins</groupId>\r
+                               <artifactId>maven-antrun-plugin</artifactId>\r
+                               <version>1.1</version>\r
+                               <executions>\r
+                                       <execution>\r
+                                               <phase>validate</phase>\r
+                                               <goals>\r
+                                                       <goal>run</goal>\r
+                                               </goals>\r
+                                               <configuration>\r
+                                                       <tasks>\r
+                                                               <echo>*** SETTINGS ***</echo>\r
+                                                               <echo>[remote.address] ${remote.address}</echo>\r
+                                                               <echo>[remote.location] ${remote.location}</echo>\r
+                                                       </tasks>\r
+                                               </configuration>\r
+                                       </execution>\r
+                               </executions>\r
+                       </plugin>\r
                        <plugin>\r
                                <groupId>org.eclipse.tycho</groupId>\r
                                <artifactId>tycho-packaging-plugin</artifactId>\r
index 8aff6869582dc18e220ad91047ce2e7926802ca2..2f9161698acb692e8f387ff69f31866e294f60f9 100644 (file)
@@ -9,52 +9,53 @@
    <launcherArgs>\r
       <programArgs>-consoleLog -console 5555\r
       </programArgs>\r
-      <vmArgs>-Xms512m
--Xmx1024m
--Dfile.encoding=UTF-8
--agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8888
--Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory
-
-#System
--Djetty.home=/opt/mediacube/configuration/jetty
--Dlog4j.configurationFile=/opt/mediacube/configuration/log4j2.xml
--Djobengine.jobsteps.root=/opt/mediacube/configuration/executors
--Djobengine.jobtemplates.root=/opt/mediacube/configuration/jobtemplates
--Djobengine.jobscheduling.config=/opt/mediacube/configuration/scheduledjobs.json
-
--Dorg.eclipse.epp.logging.aeri.skipReports=true 
--Declipse.ignoreApp=true 
--Dosgi.noShutdown=true
--Djobengine.loglevel=INFO
--Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,etc/user-jetty-http.xml,etc/user-jetty-https.xml\r
-      </vmArgs>\r
-      <vmArgsLin>#Database\r
--Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;\r
--Djobengine.db.user=db2admin\r
--Djobengine.db.password=password\r
--Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;\r
--Djobengine.nosql.db.user=db2admin\r
--Djobengine.nosql.db.password=password\r
--Djobengine.nosql.db.schema=test\r
-\r
-#Octopus\r
--Djobengine.octopus.api.address=http://10.10.1.11/api/v1\r
--Djobengine.octopus.api.user=mam\r
--Djobengine.octopus.api.password=napocska\r
--Djobengine.octopus.rundowns.name=rundowns\r
--Djobengine.octopus.storyfolders.name=storyfolders\r
--Djobengine.octopus.stories.name=stories\r
+      <vmArgs>-Xms512m\r
+-Xmx1024m\r
+-Dfile.encoding=UTF-8\r
+-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8888\r
+-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory\r
 \r
-#Selenio\r
--Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl\r
--Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium\r
+#System\r
+-Djetty.home=/opt/mediacube/configuration/jetty\r
+-Dlog4j.configurationFile=/opt/mediacube/configuration/log4j2.xml\r
+-Djobengine.jobsteps.root=/opt/mediacube/configuration/executors\r
+-Djobengine.jobtemplates.root=/opt/mediacube/configuration/jobtemplates\r
+-Djobengine.jobscheduling.config=/opt/mediacube/configuration/scheduledjobs.json\r
+-Dmediacube.auth.location=/opt/mediacube/configuration/mediacube-auth.properties\r
 \r
-#Nexio\r
--Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB;\r
--Djobengine.nexio.db.user=sa\r
--Djobengine.nexio.db.password=resolve\r
--Dnexio.useMOSGateway=true\r
--Dnexio.host=10.10.1.55\r
+-Dorg.eclipse.epp.logging.aeri.skipReports=true \r
+-Declipse.ignoreApp=true \r
+-Dosgi.noShutdown=true\r
+-Djobengine.loglevel=INFO\r
+-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,etc/user-jetty-http.xml,etc/user-jetty-https.xml\r
+      </vmArgs>\r
+      <vmArgsLin>#Database
+-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;
+-Djobengine.db.user=db2admin
+-Djobengine.db.password=password
+-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;
+-Djobengine.nosql.db.user=db2admin
+-Djobengine.nosql.db.password=password
+-Djobengine.nosql.db.schema=test
+
+#Octopus
+-Djobengine.octopus.api.address=http://10.10.1.11/api/v1
+-Djobengine.octopus.api.user=mam
+-Djobengine.octopus.api.password=napocska
+-Djobengine.octopus.rundowns.name=rundowns
+-Djobengine.octopus.storyfolders.name=storyfolders
+-Djobengine.octopus.stories.name=stories
+
+#Selenio
+-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl
+-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium
+
+#Nexio
+-Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB;
+-Djobengine.nexio.db.user=sa
+-Djobengine.nexio.db.password=resolve
+-Dnexio.useMOSGateway=true
+-Dnexio.host=10.10.1.55
 -Dnexio.disable=false\r
       </vmArgsLin>\r
       <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts\r
index cc77af1a51b30c615df78c7083d6c1f09149694a..66a07dde12614afc493eb35d52a7ff7e4e261489 100644 (file)
                                <artifactId>maven-resources-plugin</artifactId>\r
                                <version>2.7</version>\r
                                <executions>\r
-                                       <execution>\r
-                                               <id>copy-resources-1</id>\r
-                                               <phase>install</phase>\r
-                                               <goals>\r
-                                                       <goal>copy-resources</goal>\r
-                                               </goals>\r
-                                               <configuration>\r
-                                                       <outputDirectory>${project.build.directory}/products/MediaCube/win32/win32/x86_64/configuration</outputDirectory>\r
-                                                       <resources>\r
-                                                               <resource>\r
-                                                                       <directory>${basedir}/../-configuration</directory>\r
-                                                                       <includes>\r
-                                                                               <include>dsm.opt</include>\r
-                                                                       </includes>\r
-                                                               </resource>\r
-                                                               <resource>\r
-                                                                       <directory>${basedir}/../user.jobengine.executors/config</directory>\r
-                                                                       <includes>\r
-                                                                               <include>scheduledjobs.json</include>\r
-                                                                       </includes>\r
-                                                               </resource>\r
-                                                               <resource>\r
-                                                                       <directory>${basedir}</directory>\r
-                                                                       <includes>\r
-                                                                               <include>log4j2.xml</include>\r
-                                                                       </includes>\r
-                                                               </resource>\r
-                                                       </resources>\r
-                                               </configuration>\r
-                                       </execution>\r
                                        <execution>\r
                                                <id>copy-resources-1-lnx</id>\r
                                                <phase>install</phase>\r
                                                        </resources>\r
                                                </configuration>\r
                                        </execution>\r
-                                       <execution>\r
-                                               <id>copy-resources-2</id>\r
-                                               <phase>install</phase>\r
-                                               <goals>\r
-                                                       <goal>copy-resources</goal>\r
-                                               </goals>\r
-                                               <configuration>\r
-                                                       <outputDirectory>${project.build.directory}/products/MediaCube/win32/win32/x86_64/configuration/executors</outputDirectory>\r
-                                                       <resources>\r
-                                                               <resource>\r
-                                                                       <directory>${basedir}/../user.jobengine.executors/config</directory>\r
-                                                                       <includes>\r
-                                                                               <include>config.xml</include>\r
-                                                                       </includes>\r
-                                                               </resource>\r
-                                                       </resources>\r
-                                               </configuration>\r
-                                       </execution>\r
                                        <execution>\r
                                                <id>copy-resources-2-lnx</id>\r
                                                <phase>install</phase>\r
                                                        </resources>\r
                                                </configuration>\r
                                        </execution>\r
-                                       <execution>\r
-                                               <id>copy-resources-3</id>\r
-                                               <phase>install</phase>\r
-                                               <goals>\r
-                                                       <goal>copy-resources</goal>\r
-                                               </goals>\r
-                                               <configuration>\r
-                                                       <outputDirectory>${project.build.directory}/products/MediaCube/win32/win32/x86_64/configuration/executors</outputDirectory>\r
-                                                       <resources>\r
-                                                               <resource>\r
-                                                                       <directory>${basedir}/../user.jobengine.executors/bin/user/jobengine/server/steps</directory>\r
-                                                               </resource>\r
-                                                       </resources>\r
-                                               </configuration>\r
-                                       </execution>\r
                                        <execution>\r
                                                <id>copy-resources-3-lnx</id>\r
                                                <phase>install</phase>\r
                                                        </resources>\r
                                                </configuration>\r
                                        </execution>\r
-                                       <execution>\r
-                                               <id>copy-resources-4</id>\r
-                                               <phase>install</phase>\r
-                                               <goals>\r
-                                                       <goal>copy-resources</goal>\r
-                                               </goals>\r
-                                               <configuration>\r
-                                                       <outputDirectory>${project.build.directory}/products/MediaCube/win32/win32/x86_64/configuration/jobtemplates</outputDirectory>\r
-                                                       <resources>\r
-                                                               <resource>\r
-                                                                       <directory>${basedir}/../user.jobengine.executors/jobtemplates</directory>\r
-                                                               </resource>\r
-                                                       </resources>\r
-                                               </configuration>\r
-                                       </execution>\r
                                        <execution>\r
                                                <id>copy-resources-4-lnx</id>\r
                                                <phase>install</phase>\r
                                                        </resources>\r
                                                </configuration>\r
                                        </execution>\r
-                                       <execution>\r
-                                               <id>copy-resources-5</id>\r
-                                               <phase>install</phase>\r
-                                               <goals>\r
-                                                       <goal>copy-resources</goal>\r
-                                               </goals>\r
-                                               <configuration>\r
-                                                       <outputDirectory>${project.build.directory}/products/MediaCube/win32/win32/x86_64/configuration/jetty/etc</outputDirectory>\r
-                                                       <resources>\r
-                                                               <resource>\r
-                                                                       <directory>${basedir}/../-configuration/jetty-deploy/etc</directory>\r
-                                                               </resource>\r
-                                                       </resources>\r
-                                               </configuration>\r
-                                       </execution>\r
                                        <execution>\r
                                                <id>copy-resources-5-lnx</id>\r
                                                <phase>install</phase>\r
                                                        </resources>\r
                                                </configuration>\r
                                        </execution>\r
-                                       <execution>\r
-                                               <id>copy-resources-6</id>\r
-                                               <phase>install</phase>\r
-                                               <goals>\r
-                                                       <goal>copy-resources</goal>\r
-                                               </goals>\r
-                                               <configuration>\r
-                                                       <outputDirectory>${project.build.directory}/products/MediaCube/win32/win32/x86_64</outputDirectory>\r
-                                                       <resources>\r
-                                                               <resource>\r
-                                                                       <directory>${basedir}/../-configuration</directory>\r
-                                                                       <includes>\r
-                                                                               <include>start-mediacube.sh</include>\r
-                                                                               <include>stop-mediacube.sh</include>\r
-                                                                       </includes>\r
-                                                               </resource>\r
-                                                       </resources>\r
-                                               </configuration>\r
-                                       </execution>\r
                                        <execution>\r
                                                <id>copy-resources-6-lnx</id>\r
                                                <phase>install</phase>\r
                                                                        <includes>\r
                                                                                <include>start-mediacube.sh</include>\r
                                                                                <include>stop-mediacube.sh</include>\r
+                                                                               <include>mediacube-auth.properties</include>\r
                                                                        </includes>\r
                                                                </resource>\r
                                                        </resources>\r
index 7a4dffbfa55dd501c94c0e19bb8f981bc83b7f78..e957186f911016b505b8fc408d6ac39a4ff7c787 100644 (file)
@@ -40,7 +40,8 @@ public final class HTMLMailAppender extends AbstractAppender {
 
        private static final int DEFAULT_BUFFER_SIZE = 512;
 
-       private static final ExecutorService executor = Executors.newFixedThreadPool(5);
+       private static final int CONCURRENT_MAIL_QUEUES = 1;
+       private static final ExecutorService executor = Executors.newFixedThreadPool(CONCURRENT_MAIL_QUEUES);
 
        /**
         * Create a SmtpAppender.
@@ -111,9 +112,8 @@ public final class HTMLMailAppender extends AbstractAppender {
 
                final SmtpManager manager = SmtpManager.getSmtpManager(configuration, to, cc, bcc, from, replyTo, subject, smtpProtocol, smtpHost, smtpPort,
                                smtpUsername, smtpPassword, isSmtpDebug, filter.toString(), bufferSize);
-               if (manager == null) {
+               if (manager == null)
                        return null;
-               }
 
                return new HTMLMailAppender(name, filter, layout, manager, ignoreExceptions);
        }
index 134524baec3f9c83f03b271a199e612a69f478ca..3e7477737ced5bea4b6891c65f61e9319ce8fc83 100644 (file)
@@ -29,7 +29,6 @@ import javax.mail.MessagingException;
 import javax.mail.PasswordAuthentication;
 import javax.mail.Session;
 import javax.mail.Transport;
-import javax.mail.internet.InternetAddress;
 import javax.mail.internet.InternetHeaders;
 import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
@@ -213,11 +212,14 @@ public class SmtpManager extends AbstractManager {
 
        private final FactoryData data;
 
+       private String defaultRecipient;
+
        protected SmtpManager(final String name, final Session session, final MimeMessage message, final FactoryData data) {
                super(null, name);
                this.session = session;
                this.message = message;
                this.data = data;
+               this.defaultRecipient = data.to;
                //this.buffer = new CyclicBuffer<>(LogEvent.class, data.numElements);
        }
 
@@ -294,8 +296,9 @@ public class SmtpManager extends AbstractManager {
                try {
                        if (appendEvent.getMarker() instanceof MediaCubeMarker) {
                                MediaCubeMarker mcm = (MediaCubeMarker) appendEvent.getMarker();
-                               message.setRecipient(RecipientType.TO, new InternetAddress(mcm.getTo()));
-                       }
+                               message.setRecipients(RecipientType.TO, mcm.getTo());
+                       } else
+                               message.setRecipients(RecipientType.TO, defaultRecipient);
 
                        //final LogEvent[] priorEvents = buffer.removeAll();
                        // LOG4J-310: log appendEvent even if priorEvents is empty
diff --git a/server/user.jobengine.executors/LogCollector.java b/server/user.jobengine.executors/LogCollector.java
new file mode 100644 (file)
index 0000000..a5835c3
--- /dev/null
@@ -0,0 +1,121 @@
+package user.jobengine.server.steps;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.apache.logging.log4j.Level;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.MarkerManager;\r
+import org.apache.logging.log4j.core.Appender;\r
+import org.apache.logging.log4j.core.Logger;\r
+import org.apache.logging.log4j.core.LoggerContext;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.MessageFactory;\r
+import org.apache.logging.log4j.util.ReflectionUtil;\r
+\r
+public class LogCollector extends Logger {\r
+\r
+       class CollectedMessage {\r
+               private String message;\r
+               private Level level;\r
+\r
+               CollectedMessage(Level level, Message message) {\r
+                       this.level = level;\r
+                       this.message = message.getFormattedMessage();\r
+               }\r
+\r
+               @Override\r
+               public String toString() {\r
+                       return String.format("%s %s\r\n", level, message);\r
+               }\r
+       }\r
+\r
+       private static final String LOGCOLLECTOR_FINISH = "LOGCOLLECTOR_FINISH";\r
+       public static Marker FINISH = MarkerManager.getMarker(LOGCOLLECTOR_FINISH);\r
+\r
+       public static org.apache.logging.log4j.Logger getLogger() {\r
+               Logger logger = (Logger) LogManager.getLogger(ReflectionUtil.getCallerClass(2));\r
+               LogCollector result = new LogCollector(logger.getContext(), logger.getName(), logger.getMessageFactory());\r
+               return result;\r
+       }\r
+\r
+       private Map<Marker, List<CollectedMessage>> messages = new HashMap<>();\r
+\r
+       protected LogCollector(LoggerContext context, String name, MessageFactory messageFactory) {\r
+               super(context, name, messageFactory);\r
+               Map<String, Appender> appenders = super.getAppenders();\r
+       }\r
+\r
+       private void collect(Marker marker, Level level, Message message) {\r
+               //LogEvent event = Log4jLogEvent.newBuilder().setMessage(message).setMarker(marker).setLevel(level).setLoggerName(super.getName()).build();\r
+               List<CollectedMessage> msgList = messages.get(marker);\r
+               if (msgList == null) {\r
+                       msgList = new ArrayList<>();\r
+                       messages.put(marker, msgList);\r
+               }\r
+               msgList.add(new CollectedMessage(level, message));\r
+       }\r
+\r
+       @Override\r
+       public void error(Marker marker, String message) {\r
+               Message msg = getMessageFactory().newMessage(message);\r
+               collect(marker, Level.ERROR, msg);\r
+               super.error(marker, message);\r
+       }\r
+\r
+       @Override\r
+       public void error(Marker marker, String message, Object... params) {\r
+               Message msg = getMessageFactory().newMessage(message, params);\r
+               collect(marker, Level.ERROR, msg);\r
+               super.error(marker, message, params);\r
+       }\r
+\r
+       private void finish() {\r
+               Set<Marker> markers = messages.keySet();\r
+               for (Marker marker : markers) {\r
+                       List<CollectedMessage> msgList = messages.get(marker);\r
+                       StringBuilder sb = new StringBuilder();\r
+                       for (CollectedMessage msg : msgList) {\r
+                               sb.append(msg.toString());\r
+                       }\r
+                       super.info(marker, sb.toString());\r
+               }\r
+               messages.clear();\r
+       }\r
+\r
+       @Override\r
+       public void info(Marker marker, String message) {\r
+               Message msg = getMessageFactory().newMessage(message);\r
+               collect(marker, Level.INFO, msg);\r
+       }\r
+\r
+       @Override\r
+       public void info(Marker marker, String message, Object... params) {\r
+               Message msg = getMessageFactory().newMessage(message, params);\r
+               collect(marker, Level.INFO, msg);\r
+       }\r
+\r
+       @Override\r
+       public void info(Object message) {\r
+               if (message instanceof Marker && LOGCOLLECTOR_FINISH.equals(((Marker) message).getName())) {\r
+                       finish();\r
+                       return;\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public void warn(Marker marker, String message) {\r
+               Message msg = getMessageFactory().newMessage(message);\r
+               collect(marker, Level.WARN, msg);\r
+       }\r
+\r
+       @Override\r
+       public void warn(Marker marker, String message, Object... params) {\r
+               Message msg = getMessageFactory().newMessage(message, params);\r
+               collect(marker, Level.WARN, msg);\r
+       }\r
+}\r
index 2fc6fbcc3eb896a4459617f8075a807f871924b3..121efda8ae26205e3b84e30541dc8be41a59c45b 100644 (file)
@@ -9,8 +9,7 @@ Require-Bundle: user.jobengine.osgi.commons;bundle-version="1.0.0",
  org.apache.commons.lang;bundle-version="2.6.0",
  user.jobengine.osgi.server;bundle-version="1.0.0",
  user.jobengine.osgi.db,
- com.ibm.nosql;bundle-version="4.19.26",
- org.apache.logging.log4j.api;bundle-version="2.8.2"
+ com.ibm.nosql;bundle-version="4.19.26"
 Bundle-ClassPath: .
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
@@ -23,6 +22,8 @@ Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
  javax.ws.rs.core;version="2.0.1",
  org.apache.commons.io;version="2.2.0",
  org.apache.commons.net.ftp;version="3.6.0",
+ org.apache.logging.log4j;version="2.8.2",
+ org.apache.logging.log4j.message;version="2.8.2",
  org.jboss.resteasy.client.jaxrs,
  org.jboss.resteasy.plugins.providers,
  org.jboss.resteasy.spi,
diff --git a/server/user.jobengine.executors/jobtemplates/copyforarchive-nexio-recordings.xml b/server/user.jobengine.executors/jobtemplates/copyforarchive-nexio-recordings.xml
new file mode 100644 (file)
index 0000000..b9feae2
--- /dev/null
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="NEXIO anyagok törlése">\r
+       <declarations>\r
+               <parameters>\r
+<!--                   A host név 'nexio.host' rendszerparaméter -->\r
+                       <parameter name="nexioPort" type="java.lang.Integer"/>\r
+                       <parameter name="nexioUserName" type="java.lang.String"/>\r
+                       <parameter name="nexioPassword" type="java.lang.String"/>\r
+                       <parameter name="archiveFtp" type="java.lang.String"/>\r
+                       <parameter name="archiveUserName" type="java.lang.String"/>\r
+                       <parameter name="archivePassword" type="java.lang.String"/>\r
+                       <parameter name="agencies" type="java.lang.String"/>\r
+                       <parameter name="limit" type="java.lang.Integer"/>\r
+                       <parameter name="nexioKillDateDays" type="java.lang.Integer"/>\r
+                       <parameter name="nexioAgency" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="id1" type="user.jobengine.server.steps.CopyForArchiveNEXIORecordingsStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="nexioPort" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioUserName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioPassword" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="archiveFtp" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="archiveUserName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="archivePassword" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="agencies" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="limit" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioKillDateDays" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioAgency" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
index 01aba298c62d930ded706491d41e5bad745c9581..545e8cc0edccb9771788d6bd096b4942ba7ac504 100644 (file)
@@ -41,6 +41,7 @@ public class ArchiveListBuilderStep extends JobStep {
        public static final String MEDIA_HOUSEID = "mediaHouseId";\r
        public static final String MEDIA_TITLE = "mediaTitle";\r
        public static final String MEDIA_DESCRIPTION = "mediaDescription";\r
+       public static final String MEDIA_TYPE = "mediaType";\r
        private static final String DURATION = "duration";\r
 \r
        private ArchiveItem createArchiveItem(Path jsonFilePath, Path mediaFilePath, Path catchedFilePath) {\r
@@ -58,6 +59,7 @@ public class ArchiveListBuilderStep extends JobStep {
                        result.setMediaHouseId(getMetadata(dbObject, MEDIA_HOUSEID));\r
                        result.setMediaTitle(getMetadata(dbObject, MEDIA_TITLE));\r
                        result.setMediaDescription(getMetadata(dbObject, MEDIA_DESCRIPTION));\r
+                       result.setMediaType(getMetadata(dbObject, MEDIA_TYPE));\r
                        result.setMediaFile(mediaFilePath.toString());\r
                        result.setCatchedFile(catchedFilePath.toString());\r
                        result.setDuration(NoSQLUtils.asLong(dbObject, DURATION));\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIORecordingsStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIORecordingsStep.java
new file mode 100644 (file)
index 0000000..ad37811
--- /dev/null
@@ -0,0 +1,408 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.OutputStream;\r
+import java.net.InetAddress;\r
+import java.net.URI;\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.net.ftp.FTP;\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.commons.net.ftp.FTPReply;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+import com.ibm.nosql.json.api.DBCursor;\r
+import com.ibm.nosql.json.api.DBObject;\r
+import com.ibm.nosql.json.api.QueryBuilder;\r
+\r
+import user.commons.CalendarUtils;\r
+import user.commons.ListUtils;\r
+import user.commons.StoreUri;\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.commons.octopus.IOctopusAPI;\r
+import user.commons.octopus.OctopusAPI;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class CopyForArchiveNEXIORecordingsStep extends JobStep {\r
+       private static final String MEDIATYPE_RECORDING = "Visszarögzített";\r
+       private static final String SCHEDULED_FORMAT = "yyyy.MM.dd HH:mm";\r
+       private static final String STARTTIME_FORMAT = "HHmm";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String UTF_8 = "utf-8";\r
+       private static final String JSON_EXT = ".json";\r
+       private static final String XML_EXT = ".xml";\r
+       private static final String DURATION = "duration";\r
+       private static final String MXFEXT = ".MXF";\r
+       private static final String NEXIOCLIPS = "nexioclips";\r
+       private static final String LONGNAMEID = "longnameid";\r
+       private static final String ID = "id";\r
+       private static final String EXTAGENCY = "extagency";\r
+       private static final String RECORDDATE = "recorddate";\r
+       private static final SimpleDateFormat startTimeformat = new SimpleDateFormat(STARTTIME_FORMAT);\r
+\r
+       private OctopusAPI octopusAPI;\r
+       private IItemManager manager;\r
+\r
+       private DB db;\r
+       private FTPClient sourceFtp;\r
+       private FTPClient targetFtp;\r
+       private StoreUri sourceUri;\r
+       private StoreUri targetUri;\r
+       private int nexioKillDateDays;\r
+       private String nexioAgency;\r
+       private Object[] filterAgencies;\r
+\r
+       private int check(int value, String name) {\r
+               if (value == 0) {\r
+                       logger.error(getMarker(), "A folyamat '{}' bemeneti paramétere 0.", name);\r
+                       throw new NullPointerException(String.format("System is not configured properly, missing '%s' input parameter.", name));\r
+               }\r
+               return value;\r
+       }\r
+\r
+       private String check(String value, String name) {\r
+               if (StringUtils.isBlank(value)) {\r
+                       logger.error(getMarker(), "A folyamat '{}' bemeneti paramétere üres.", name);\r
+                       throw new NullPointerException(String.format("System is not configured properly, missing '%s' input parameter.", name));\r
+               }\r
+               return value;\r
+       }\r
+\r
+       private void copy(RundownArchive rundownArchive) {\r
+               for (StoryArchive storyArchive : rundownArchive.getStoryArchives()) {\r
+                       for (FileArchive fileArchive : storyArchive.getFileArchives()) {\r
+                               try {\r
+                                       copyFile(fileArchive, rundownArchive, storyArchive);\r
+                                       logger.info(getMarker(), "Sikeres anyag archiválás a '{}' tükörhöz: '{}'.", rundownArchive.getItemTitle(), fileArchive.getFileName());\r
+                               } catch (Exception e) {\r
+                                       logger.error(getMarker(), "Az '{}' anyag archiválása sikertelen. A rendszer üzenete: {}", fileArchive.getFileName(), e.getMessage());\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       private void copyFile(FileArchive fileArchive, RundownArchive rundownArchive, StoryArchive storyArchive) throws Exception {\r
+               String origFileName = fileArchive.getFileName();\r
+               String videoFileName = origFileName + MXFEXT;\r
+\r
+               transferFile(videoFileName, videoFileName);\r
+               BasicDBObject metadata = createMetadata(rundownArchive, storyArchive, fileArchive);\r
+               transferMetadata(videoFileName, metadata);\r
+               createSourceKillDateFile(rundownArchive, origFileName);\r
+       }\r
+\r
+       private BasicDBObject createMetadata(RundownArchive rundownArchive, StoryArchive storyArchive, FileArchive fileArchive) {\r
+               BasicDBObject result = new BasicDBObject();\r
+               result.put("itemHouseId", rundownArchive.getItemHouseId());\r
+               result.put("itemTitle", rundownArchive.getItemTitle());\r
+               result.put("itemDescription", rundownArchive.getItemDesc());\r
+               result.put("userName", "mediacube");\r
+\r
+               result.put("mediaHouseId", storyArchive.getMediaHouseId());\r
+               result.put("mediaTitle", storyArchive.getMediaTitle());\r
+               result.put("mediaDescription", storyArchive.getMediaDesc());\r
+\r
+               result.put("duration", fileArchive.getDuration());\r
+               result.put("mediaType", MEDIATYPE_RECORDING);\r
+               return result;\r
+       }\r
+\r
+       private void createSourceKillDateFile(RundownArchive rundownArchive, String fileName) throws Exception {\r
+               logger.info("Create killdate/agency for {}", fileName);\r
+               OutputStream outStream = null;\r
+               try {\r
+                       sourceFtp = ((FtpDirectoryLister) sourceUri.getLister()).connect();\r
+                       Calendar killDate = CalendarUtils.createCalendar(rundownArchive.getScheduleDate());\r
+                       killDate.add(Calendar.DAY_OF_YEAR, nexioKillDateDays);\r
+                       byte[] killDateFile = EscortFiles.createNEXIOKillDateFile(fileName, killDate.getTime(), null, nexioAgency);\r
+                       outStream = sourceFtp.storeFileStream(fileName + XML_EXT);\r
+                       if (outStream == null) {\r
+                               throw new NullPointerException("Can not open: " + fileName + XML_EXT + " Reply:" + sourceFtp.getReplyString());\r
+                       }\r
+                       outStream.write(killDateFile);\r
+                       outStream.flush();\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       if (outStream != null)\r
+                               outStream.close();\r
+                       sourceUri.cleanUp();\r
+               }\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(int nexioPort, String nexioUserName, String nexioPassword, String archiveFtp, String archiveUserName, String archivePassword,\r
+                       String agencies, int limit, int nexioKillDateDays, String nexioAgency, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               setAndCheck(nexioPort, nexioUserName, nexioPassword, archiveFtp, archiveUserName, archivePassword, agencies, limit, nexioKillDateDays, nexioAgency,\r
+                               jobEngine);\r
+               octopusAPI = new OctopusAPI();\r
+               List<BasicDBObject> clips = queryClips();\r
+               processClips(clips, limit);\r
+               return null;\r
+       }\r
+\r
+       private Date getScheduledStart(String clipName, Date recordDate) {\r
+               if (StringUtils.isBlank(clipName))\r
+                       logger.warn(getMarker(), "A anyagnak nincs neve, ezért nem archiválható.", clipName);\r
+               if (recordDate == null)\r
+                       logger.warn(getMarker(), "A {} anyag rögzítésének ideje nem meghatározható, ezért nem archiválható.", clipName);\r
+\r
+               Date timePart = null;\r
+               try {\r
+                       String clipNameTime = clipName.split("_")[0];\r
+                       timePart = startTimeformat.parse(clipNameTime);\r
+               } catch (ParseException e) {\r
+                       logger.warn(getMarker(), "A {} anyag neve nem időbélyeggel kezdődik, ezért nem archiválható.", clipName);\r
+                       return null;\r
+               }\r
+               return CalendarUtils.createCalendar(CalendarUtils.createCalendar(recordDate), timePart).getTime();\r
+       }\r
+\r
+       private RundownArchive processClip(BasicDBObject clip) {\r
+               RundownArchive result = null;\r
+               String clipName = NoSQLUtils.asString(clip, LONGNAMEID);\r
+               Date recordDate = clip.getDate(RECORDDATE);\r
+               long duration = NoSQLUtils.asLong(clip, DURATION);\r
+               logger.info("Processing {} {}", clipName, recordDate);\r
+               Date scheduledStart = getScheduledStart(clipName, recordDate);\r
+               if (scheduledStart == null)\r
+                       return null;\r
+               DBObject rundown = octopusAPI.getRundown(scheduledStart);\r
+               if (rundown == null) {\r
+                       logger.warn(getMarker(), "A '{}' anyaghoz nem talllható tükör '{}' kezdéssel, ezért nem archiválható.", clipName, scheduledStart);\r
+                       return null;\r
+               }\r
+\r
+               try {\r
+                       result = processRundow(rundown, clipName, duration);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(getMarker(), "A '{}' anyag metaadatainak transzformálása sikertelen, ezért az nem archiválható. A rendszer hibaüzenete: {}",\r
+                                       e.getMessage());\r
+                       return null;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private void processClips(List<BasicDBObject> clips, int limit) {\r
+               logger.info(getMarker(), "A folyamat {} archiválható anyagot érzékelt.", clips.size());\r
+               int current = 0;\r
+               for (BasicDBObject clip : clips) {\r
+                       RundownArchive rundownArchive = processClip(clip);\r
+                       if (rundownArchive == null)\r
+                               continue;\r
+\r
+                       copy(rundownArchive);\r
+\r
+                       current++;\r
+                       if (current == limit)\r
+                               break;\r
+                       setProgress(current * 100 / limit);\r
+               }\r
+       }\r
+\r
+       private RundownArchive processRundow(DBObject r, String clipName, long duration) throws Exception {\r
+               BasicDBObject rundown = (BasicDBObject) r;\r
+               long rundownID = rundown.getLong(ID);\r
+               logger.info("Processing rundown {} {}", rundownID, rundown.getString(IOctopusAPI.NAME));\r
+\r
+               List<DBObject> stories = octopusAPI.getRundownFullStories(rundownID);\r
+               if (stories == null)\r
+                       return null;\r
+               RundownArchive result = new RundownArchive();\r
+\r
+               long id = NoSQLUtils.asLong(rundown, IOctopusAPI.ID);\r
+               if (id == 0)\r
+                       return null;\r
+               String name = NoSQLUtils.asString(NoSQLUtils.asDBObject(rundown, IOctopusAPI.RUNDOWN_TYPE), IOctopusAPI.NAME);\r
+               if (StringUtils.isBlank(name))\r
+                       return null;\r
+               String channel = NoSQLUtils.asString(NoSQLUtils.asDBObject(rundown, IOctopusAPI.CHANNEL), IOctopusAPI.NAME);\r
+               Date scheduledStart = rundown.getDate(IOctopusAPI.SCHEDULED_START);\r
+               if (scheduledStart == null)\r
+                       return null;\r
+               String start = CalendarUtils.toString(CalendarUtils.createCalendar(scheduledStart), SCHEDULED_FORMAT);\r
+               result.setScheduleDate(scheduledStart);\r
+               result.setItemHouseId(String.valueOf(id));\r
+               result.setItemTitle(String.format("%s %s %s", start, name, channel));\r
+\r
+               StringBuilder sb = new StringBuilder();\r
+               for (DBObject s : stories) {\r
+                       BasicDBObject story = (BasicDBObject) s;\r
+                       sb.append(story.getString(IOctopusAPI.PARENT_STORY_ID));\r
+                       sb.append(" [" + story.getString(IOctopusAPI.FORMAT) + "] ");\r
+                       sb.append(story.getString(IOctopusAPI.NAME));\r
+                       sb.append("\r\n");\r
+               }\r
+               StoryArchive storyArchive = new StoryArchive();\r
+               storyArchive.setMediaHouseId(result.getItemHouseId());\r
+               storyArchive.setMediaTitle(clipName);\r
+               storyArchive.setMediaDesc(sb.toString());\r
+               result.addStoryArchive(storyArchive);\r
+               storyArchive.addFileArchive(new FileArchive(clipName, duration));\r
+               return result;\r
+       }\r
+\r
+       private List<BasicDBObject> queryClips() {\r
+               DBCollection collection = db.getCollection(NEXIOCLIPS);\r
+               BasicDBList agencies = new BasicDBList(filterAgencies);\r
+\r
+               Calendar now = CalendarUtils.createZeroCalendar();\r
+               QueryBuilder dateQueryBuilder = QueryBuilder.start(RECORDDATE).lessThan(now.getTime());\r
+               QueryBuilder queryBuilder = QueryBuilder.start(EXTAGENCY).in(agencies).and(dateQueryBuilder.get());\r
+               DBCursor cursor = collection.find(queryBuilder.get()).sort(RECORDDATE, -1);\r
+               if (!cursor.hasNext())\r
+                       return null;\r
+               return ListUtils.cast(cursor.toArray());\r
+       }\r
+\r
+       private void setAndCheck(int nexioPort, String nexioUserName, String nexioPassword, String archiveFtp, String archiveUserName, String archivePassword,\r
+                       String agencies, int limit, int nexioKillDateDays, String nexioAgency, IJobEngine jobEngine) throws Exception {\r
+               db = NoSQLUtils.getNoSQLDB();\r
+               if (db == null) {\r
+                       logger.error(getMarker(), "Az NoSQL adatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing NoSQL DB reference.");\r
+               }\r
+\r
+               if (jobEngine == null) {\r
+                       logger.error(getMarker(), "Az folyamatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing JobEngine reference.");\r
+               }\r
+               manager = jobEngine.getItemManager();\r
+               if (manager == null) {\r
+                       logger.error(getMarker(), "Az adatbáziskezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+               }\r
+               String nexioHost = System.getProperty("nexio.host");\r
+               if (StringUtils.isBlank(nexioHost)) {\r
+                       logger.error(getMarker(), "A 'nexio.host' rendszer paraméter nem található.");\r
+                       throw new NullPointerException("System is not configured properly, 'jobengine.selenio.address' startup parameter missing.");\r
+               }\r
+               check(nexioPort, "nexioPort");\r
+               check(nexioUserName, "nexioUserName");\r
+               check(nexioPassword, "nexioPassword");\r
+\r
+               check(agencies, "agencies");\r
+               filterAgencies = agencies.split(",");\r
+\r
+               check(limit, "limit");\r
+\r
+               check(nexioKillDateDays, "nexioKillDateDays");\r
+               this.nexioKillDateDays = nexioKillDateDays;\r
+               check(nexioAgency, "nexioAgency");\r
+               this.nexioAgency = nexioAgency;\r
+\r
+               sourceUri = manager.createStoreUri(RemoteStoreProtocol.FTP, nexioHost);\r
+               sourceUri.setPortNumber(nexioPort);\r
+               sourceUri.setUserName(nexioUserName);\r
+               sourceUri.setPassword(nexioPassword);\r
+               if (sourceUri == null) {\r
+                       logger.error(getMarker(), "A forrás nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing 'sourceUri'.");\r
+               }\r
+\r
+               check(archiveFtp, "archiveFtp");\r
+               check(archiveUserName, "archiveUserName");\r
+               check(archivePassword, "archivePassword");\r
+\r
+               targetUri = manager.createStoreUri(new URI(archiveFtp));\r
+               targetUri.setUserName(archiveUserName);\r
+               targetUri.setPassword(archivePassword);\r
+               if (targetUri == null) {\r
+                       logger.error(getMarker(), "A cél nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing 'targetUri'.");\r
+               }\r
+\r
+       }\r
+\r
+       private void transferFile(String sourceFileName, String targetFileName) throws Exception {\r
+               int reply = 0;\r
+               logger.info("Transfer clip {}", sourceFileName);\r
+               try {\r
+                       sourceFtp = ((FtpDirectoryLister) sourceUri.getLister()).connect();\r
+                       targetFtp = ((FtpDirectoryLister) targetUri.getLister()).connect();\r
+                       if (!targetFtp.enterRemotePassiveMode())\r
+                               throw new Exception("!PASV");\r
+\r
+                       reply = sourceFtp.port(InetAddress.getByName(targetFtp.getPassiveHost()), targetFtp.getPassivePort());\r
+                       if (!FTPReply.isPositiveCompletion(reply))\r
+                               throw new Exception("PORT parancs válasza: " + sourceFtp.getReplyString());\r
+\r
+                       if (!sourceFtp.setFileType(FTP.BINARY_FILE_TYPE))\r
+                               throw new Exception("!SOURCE TYPE");\r
+\r
+                       reply = sourceFtp.retr(sourceFileName);\r
+                       if (!FTPReply.isPositivePreliminary(reply))\r
+                               throw new Exception("RETR parancs válasza: " + sourceFtp.getReplyString());\r
+\r
+                       if (!targetFtp.setFileType(FTP.BINARY_FILE_TYPE))\r
+                               throw new Exception("!TARGET TYPE");\r
+\r
+                       reply = targetFtp.stor(targetFileName);\r
+                       if (!FTPReply.isPositivePreliminary(reply))\r
+                               throw new Exception("STOR parancs válasza: " + sourceFtp.getReplyString());\r
+\r
+                       while (true) {\r
+                               reply = sourceFtp.stat();\r
+                               if (!FTPReply.isPositiveCompletion(reply))\r
+                                       throw new Exception("STAT parancs válasza: " + sourceFtp.getReplyString());\r
+\r
+                               logger.info("Status: {}", sourceFtp.getReplyString());\r
+                               if (reply == 226) {\r
+                                       break;\r
+                               }\r
+                               Thread.sleep(1000);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       sourceUri.cleanUp();\r
+                       targetUri.cleanUp();\r
+               }\r
+\r
+       }\r
+\r
+       private void transferMetadata(String fileName, BasicDBObject metadata) throws Exception {\r
+               logger.info("Transfer metadata {}", fileName);\r
+               OutputStream outStream = null;\r
+               try {\r
+                       targetFtp = ((FtpDirectoryLister) targetUri.getLister()).connect();\r
+                       if (!targetFtp.changeWorkingDirectory(EscortFiles.STATUSFOLDER)) {\r
+                               targetFtp.makeDirectory(EscortFiles.STATUSFOLDER);\r
+                               if (!targetFtp.changeWorkingDirectory(EscortFiles.STATUSFOLDER))\r
+                                       throw new Exception("!STATUSFOLDER");\r
+                       }\r
+\r
+                       outStream = targetFtp.storeFileStream(fileName + JSON_EXT);\r
+                       if (outStream == null) {\r
+                               throw new NullPointerException("Can not open: " + fileName + JSON_EXT + " Reply:" + targetFtp.getReplyString());\r
+                       }\r
+                       outStream.write(metadata.toString().getBytes(UTF_8));\r
+                       outStream.flush();\r
+                       //targetFtp.changeToParentDirectory();\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       if (outStream != null)\r
+                               outStream.close();\r
+                       targetUri.cleanUp();\r
+               }\r
+       }\r
+\r
+}\r
index ae1878d4bb91d072194dedfb07e8d5aa567b130e..abd1b76f51c1c199e916c3b9b99ccd325659c61b 100644 (file)
@@ -3,6 +3,7 @@ package user.jobengine.server.steps;
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
+import user.commons.MediaCubeMarker;\r
 import user.jobengine.server.IJobEngine;\r
 import user.jobengine.server.IJobRuntime;\r
 \r
@@ -12,23 +13,22 @@ public class FakeNoParamsStep extends JobStep {
 \r
        @StepEntry\r
        public Object[] execute(IJobEngine jobEngine, IJobRuntime jobRuntime) throws InterruptedException {\r
-               //              try {\r
-               //                      logger.warn("| + | FakeNoParams step");\r
-               //                      jobRuntime.incrementProgress(50);\r
-               //                      Thread.sleep(15000);\r
-               //                      jobRuntime.incrementProgress(100);\r
-               //                      logger.warn("| - | FakeNoParams step");\r
-               //              } catch (Exception e) {\r
-               //                      logger.error(e.getMessage());\r
-               //              }\r
+               MediaCubeMarker toMarker = new MediaCubeMarker("vasary@gmail.com");\r
+               logger.info(toMarker, "A folyamat elindult");\r
+               logger.warn(toMarker, "Egy WARN");\r
+               logger.error(toMarker, "Egy ERROR");\r
+               logger.warn(toMarker, "Egy WARN {}", "paraméterrel");\r
+               logger.error(toMarker, "Egy ERROR {}", "paraméterrel");\r
                for (int i = 0; i < count; i++) {\r
                        if (!canContinue())\r
                                break;\r
                        jobRuntime.incrementProgress((i + 1) * count);\r
-                       Thread.sleep(5000);\r
-                       //logger.info(getMarker(), "Log markered");\r
+                       Thread.sleep(100);\r
+                       logger.info(getMarker(), "Log markered" + i);\r
                        //logger.info("Progress {}", jobRuntime.getProgress());\r
                }\r
+               logger.info(toMarker, "A folyamat véget ért");\r
+               //logger.info(LogCollector.FINISH);\r
                return null;\r
        }\r
 \r
index d9a4177c0d251844e3f9245469b5f84eac332da2..b259f0d62298ce62097406d4f82b97521c51b80c 100644 (file)
@@ -8,24 +8,25 @@ import user.jobengine.server.IJobRuntime;
 \r
 public class FakeStep extends JobStep {\r
        private static final Logger logger = LogManager.getLogger();\r
-       int count = 10;\r
+       private int count = 10;\r
+       private StringBuilder sb = new StringBuilder();\r
 \r
        @StepEntry\r
        public Object[] execute(long itemID, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
-               //              throw new Exception("42");\r
                Object[] result = { 1 };\r
                try {\r
                        for (int i = 0; i < count; i++) {\r
+                               //sb.append("Sikeres iteráció : ")\r
                                if (!canContinue())\r
                                        break;\r
                                jobRuntime.incrementProgress((i + 1) * count);\r
                                Thread.sleep(500);\r
-                               //logger.info(getMarker(), "Log markered");\r
                                //logger.info("Progress {}", jobRuntime.getProgress());\r
                        }\r
                } catch (Exception e) {\r
                        logger.error(e.getMessage());\r
                }\r
+               //logger.info(getMarker(), "Log markered");\r
                return result;\r
        }\r
 \r
index 0a0c9ac0d7b8f2e9e55578dd7b667e81f7054b60..6a7bf76f2af0c933074ad9c5e4f6395450b0573f 100644 (file)
@@ -2,11 +2,13 @@ package user.jobengine.server.steps;
 \r
 import java.io.File;\r
 \r
+import org.apache.commons.lang.StringUtils;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
 import user.jobengine.db.IItemManager;\r
 import user.jobengine.db.Item;\r
+import user.jobengine.db.ItemType;\r
 import user.jobengine.db.Media;\r
 import user.jobengine.server.IJobEngine;\r
 import user.jobengine.server.IJobRuntime;\r
@@ -30,11 +32,23 @@ public class MetadataTransformStep extends JobStep {
                                throw new NullPointerException(ITEM_MANAGER_IS_NULL);\r
                        Item mediaCubeItem = itemManager.getItemByHouseID(archiveItem.getItemHouseId());\r
                        jobRuntime.incrementProgress(50);\r
+\r
                        if (mediaCubeItem == null)\r
                                mediaCubeItem = itemManager.createItem(ITEMTYPENAME, archiveItem.getItemTitle(), archiveItem.getItemDescription(),\r
                                                archiveItem.getItemHouseId());\r
-                       mediaCubeMedia = itemManager.createMedia(ITEMTYPENAME, archiveItem.getMediaTitle(), archiveItem.getMediaDescription(),\r
-                                       archiveItem.getMediaHouseId());\r
+\r
+                       String mediaTypeName = archiveItem.getMediaType();\r
+                       if (StringUtils.isBlank(mediaTypeName)) {\r
+                               mediaCubeMedia = itemManager.createMedia(ITEMTYPENAME, archiveItem.getMediaTitle(), archiveItem.getMediaDescription(),\r
+                                               archiveItem.getMediaHouseId());\r
+                       } else {\r
+                               ItemType itemType = itemManager.getItemType(mediaTypeName);\r
+                               if (itemType == null)\r
+                                       itemManager.createItemType(mediaTypeName, mediaTypeName).add();\r
+                               mediaCubeMedia = itemManager.createMedia(mediaTypeName, archiveItem.getMediaTitle(), archiveItem.getMediaDescription(),\r
+                                               archiveItem.getMediaHouseId());\r
+                       }\r
+\r
                        mediaCubeMedia.setLength(archiveItem.getDuration());\r
                        mediaCubeItem.appendMedia(mediaCubeMedia);\r
 \r
index b684a1c027d9ef13e25429457a05bd1940c3f63d..42c7d65ac1567b2eced8cdba2dd0660183493362 100644 (file)
@@ -10,7 +10,6 @@ Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
  com.fasterxml.jackson.datatype.joda;version="2.4.5",
  com.fasterxml.jackson.jaxrs.json;version="2.4.5",
  org.apache.logging.log4j;version="2.8.2",
- org.apache.logging.log4j.core;version="2.8.2",
  org.jboss.resteasy.client.jaxrs,
  org.jboss.resteasy.plugins.providers,
  org.jboss.resteasy.spi,
index 4b49cfeaa5a02431da4dbc7ab24617a1e1f2788f..1828970ab058483325ebdec62e780caff49fcdd0 100644 (file)
@@ -36,7 +36,7 @@ public class CalendarUtils {
                if (timePart == null) {\r
                        result = createCalendar(datePart);\r
                } else {\r
-                       result = createCalendar(timePart.get(Calendar.HOUR), timePart.get(Calendar.MINUTE), timePart.get(Calendar.SECOND), datePart);\r
+                       result = createCalendar(timePart.get(Calendar.HOUR_OF_DAY), timePart.get(Calendar.MINUTE), timePart.get(Calendar.SECOND), datePart);\r
                }\r
                return result;\r
        }\r
index b8e117c8c2fc134ccfec298c54690b6304b46ccf..fa263bec893a7d850e7c7305700e02376bf22cb9 100644 (file)
@@ -5,21 +5,25 @@ import java.lang.reflect.Method;
 import java.util.ArrayList;\r
 import java.util.Collection;\r
 import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.LinkedHashSet;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.Set;\r
 import java.util.concurrent.ConcurrentHashMap;\r
 \r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
 public class ListUtils {\r
-       private final static Logger logger = LogManager.getLogger();\r
-       private static final String METHOD_GETID = "getId";\r
-\r
        public interface IMapKeyMaker<K, T> {\r
                K getKey(T item);\r
        }\r
 \r
+       private final static Logger logger = LogManager.getLogger();\r
+\r
+       private static final String METHOD_GETID = "getId";\r
+\r
        public static <T> List<T> addAll(List<T> target, Collection<T> source) {\r
                List<T> result = target;\r
                if (!isEmpty(source)) {\r
@@ -31,6 +35,16 @@ public class ListUtils {
                return result;\r
        }\r
 \r
+       public static Map<String, Object> asMap(Object... items) throws Exception {\r
+               Map<String, Object> result = new HashMap<>();\r
+               if (items.length % 2 != 0)\r
+                       throw new Exception("Even number of parameters is required.");\r
+               for (int i = 0; i < items.length; i = i + 2) {\r
+                       result.put(String.valueOf(items[i]), items[i + 1]);\r
+               }\r
+               return result;\r
+       }\r
+\r
        @SuppressWarnings("unchecked")\r
 \r
        public static <T> List<T> cast(Collection<?> collection) {\r
@@ -41,6 +55,12 @@ public class ListUtils {
                return indexOf(collection, item) > -1;\r
        }\r
 \r
+       public static <T> List<T> distinctUnion(List<T> source, List<T> target) {\r
+               Set<T> temp = new LinkedHashSet<>(source);\r
+               temp.addAll(target);\r
+               return new ArrayList<>(temp);\r
+       }\r
+\r
        public static <T> T get(Collection<T> collection, T item) {\r
                T result = null;\r
                try {\r
@@ -57,8 +77,8 @@ public class ListUtils {
                return result;\r
        }\r
 \r
-       private static long getId(Object pojo) throws NoSuchMethodException, SecurityException, IllegalAccessException,\r
-                       IllegalArgumentException, InvocationTargetException {\r
+       private static long getId(Object pojo)\r
+                       throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {\r
                Method method = pojo.getClass().getMethod(METHOD_GETID);\r
                long result = (long) method.invoke(pojo);\r
                return result;\r
@@ -92,6 +112,13 @@ public class ListUtils {
                return result;\r
        }\r
 \r
+       public static <T> List<T> intersect(List<T> source, List<T> target) {\r
+               Set<T> s1 = new HashSet<T>(source);\r
+               Set<T> s2 = new HashSet<T>(target);\r
+               s1.retainAll(s2);\r
+               return new ArrayList<>(s1);\r
+       }\r
+\r
        public static boolean isEmpty(Collection<?> collection) {\r
                return collection == null || collection.isEmpty();\r
        }\r
@@ -115,14 +142,4 @@ public class ListUtils {
                collection.add(index, item);\r
        }\r
 \r
-       public static Map<String, Object> asMap(Object... items) throws Exception {\r
-               Map<String, Object> result = new HashMap<>();\r
-               if (items.length % 2 != 0)\r
-                       throw new Exception("Even number of parameters is required.");\r
-               for (int i = 0; i < items.length; i = i + 2) {\r
-                       result.put(String.valueOf(items[i]), items[i + 1]);\r
-               }\r
-               return result;\r
-       }\r
-\r
 }\r
index 824d4c054a3acefaad7d4b0698b9128ad41fef5b..c45058740bfbe711c76074191997eb2d7994d87c 100644 (file)
@@ -43,6 +43,8 @@ public interface IOctopusAPI {
        static final String STORYID = "storyId";\r
        static final String FORMAT = "format";\r
 \r
+       DBObject getRundown(Date scheduledDate);\r
+\r
        List<DBObject> getRundownFullStories(long id);\r
 \r
        List<DBObject> getRundowns(Date scheduledDate);\r
index 3ed09ab8bbe35b25502cadcabacae5f0fad2627e..b9679a4374fee0d336920bb0ff596138e55e3935 100644 (file)
@@ -71,6 +71,16 @@ public class OctopusAPI implements IOctopusAPI {
                return result;\r
        }\r
 \r
+       @Override\r
+       public DBObject getRundown(Date scheduledDate) {\r
+               DBObject result = null;\r
+               DBCollection collection = db.getCollection(RUNDOWN_COLLECTION);\r
+               DBCursor find = collection.find(new BasicDBObject(SCHEDULED_START, scheduledDate));\r
+               if (find.hasNext())\r
+                       result = find.next();\r
+               return result;\r
+       }\r
+\r
        @Override\r
        public List<DBObject> getRundownFullStories(long id) {\r
                List<DBObject> result = null;\r
diff --git a/server/user.jobengine.osgi.commons/test/user/commons/TestMediaCubeMarker.java b/server/user.jobengine.osgi.commons/test/user/commons/TestMediaCubeMarker.java
new file mode 100644 (file)
index 0000000..f8b863d
--- /dev/null
@@ -0,0 +1,13 @@
+package user.commons;\r
+\r
+import org.apache.logging.log4j.Marker;\r
+import org.junit.Test;\r
+\r
+public class TestMediaCubeMarker {\r
+       @Test\r
+       public void test() throws Exception {\r
+               MediaCubeMarker sut = new MediaCubeMarker("valami");\r
+               Marker[] parents = sut.getParents();\r
+       }\r
+\r
+}\r
index 666e72a3d3f5ad2974ba35caa3c8b4dcb0523950..11d166a02a8c489d0e1b438c6a98b801b0b6879e 100644 (file)
@@ -10,10 +10,10 @@ Require-Bundle: user.jobengine.osgi.commons;bundle-version="1.0.0",
  com.ibm.nosql;bundle-version="4.19.26";visibility:=reexport,
  org.jmock.junit4;bundle-version="2.6.0",
  org.junit;bundle-version="4.12.0",
- org.jmock;bundle-version="2.6.0",
- org.apache.logging.log4j.api;bundle-version="2.8.2"
+ org.jmock;bundle-version="2.6.0"
 Service-Component: OSGI-INF/component.xml
 Bundle-ActivationPolicy: lazy
-Import-Package: com.fasterxml.jackson.annotation;version="2.4.5"
+Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
+ org.apache.logging.log4j;version="2.8.2"
 Export-Package: user.jobengine.db
 
index b9c67494110bc4f04ab3d6e71bd24419f77b4c0e..1cf8f58c4cc11697ee3e65d59fed3803752ac741 100644 (file)
@@ -34,8 +34,7 @@ public class TestBase {
                //              System.setProperty(ItemManager.DBPASSWORD, "password");\r
                //              System.setProperty(LogUtils.LOGLEVEL, "INFO");\r
 \r
-               System.setProperty(ItemManager.DBURL,\r
-                               "jdbc:db2://10.10.1.26:50000/mc:retrieveMessagesFromServerOnGetMessage=true;");\r
+               System.setProperty(ItemManager.DBURL, "jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;");\r
                System.setProperty(ItemManager.DBUSERNAME, "db2admin");\r
                System.setProperty(ItemManager.DBPASSWORD, "password");\r
                System.setProperty(LogUtils.LOGLEVEL, "INFO");\r
index 39c60be1247fc607b5fd0a774a37891206599471..ef3ccc6900d0a93f9dd046f19fd10b4c855b7925 100644 (file)
@@ -24,6 +24,9 @@ public class TestItem extends TestBase {
 \r
        @BeforeClass\r
        public static void initialize() {\r
+               if (manager.getItemType("Visszarögzített") == null)\r
+                       manager.createItemType("Visszarögzített", "Visszarögzített").add();\r
+\r
                // TestDB.createStructure();\r
                // TestDB.createItemTypes();\r
                if (manager.getStaticItemType() == null)\r
index b482124ac306eb6943f1b00ea94efd826473b45c..0813a5b5a434738416aca88d2e6431470c610eaa 100644 (file)
@@ -1,2 +1,3 @@
 eclipse.preferences.version=1\r
+encoding//pages/login.zul=UTF-8\r
 encoding//src/user/jobengine/server/JobRuntime.java=UTF-8\r
index 4c2176b3a52d430e965ed3478a49547262154dd0..51b3e2210ad9b9c7c370ef0c18f07ec857fa388a 100644 (file)
@@ -6,15 +6,8 @@ Bundle-Version: 1.0.0
 Service-Component: OSGI-INF/component.xml
 Import-Package: javax.servlet;version="3.1.0",
  javax.servlet.http;version="3.1.0",
- org.apache.logging.log4j.core;version="2.8.2",
- org.apache.logging.log4j.core.appender;version="2.8.2",
- org.apache.logging.log4j.core.config;version="2.8.2",
- org.apache.logging.log4j.core.config.plugins;version="2.8.2",
- org.apache.logging.log4j.core.config.plugins.validation.constraints;version="2.8.2",
- org.apache.logging.log4j.core.filter;version="2.8.2",
- org.apache.logging.log4j.core.layout;version="2.8.2",
- org.apache.logging.log4j.core.net;version="2.8.2",
- org.apache.logging.log4j.core.util;version="2.8.2",
+ org.apache.logging.log4j;version="2.8.2",
+ org.apache.logging.log4j.message;version="2.8.2",
  org.eclipse.core.runtime.adaptor,
  org.eclipse.osgi.framework.console;version="1.1.0",
  org.osgi.framework;version="1.5.0",
@@ -28,8 +21,7 @@ Require-Bundle: user.jobengine.osgi.db;bundle-version="1.0.0",
  org.junit;bundle-version="4.12.0",
  org.jmock;bundle-version="2.6.0",
  org.jmock.junit4;bundle-version="2.6.0",
- org.apache.servicemix.bundles.quartz;bundle-version="2.2.2",
- org.apache.logging.log4j.api;bundle-version="2.8.2"
+ org.apache.servicemix.bundles.quartz;bundle-version="2.2.2"
 Export-Package: user.jobengine.osgi.server,
  user.jobengine.server,
  user.jobengine.server.ast,
index 256475deba8378e432d30df1ab0f606301b1f288..de97bff59f5136c438fdf9e7f72bb66966ce0a1a 100644 (file)
@@ -1,5 +1,5 @@
-<link rel="shortcut icon" href="img/mediacube_logo_small.ico">\r
+<%@ page import="java.util.*, java.io.*, java.net.*, user.jobengine.zk.util.SessionUtil"%>\r
+<link rel="shortcut icon" href="/img/mediacube_logo_small.ico">\r
 <%\r
-       pageContext.forward("/pages/login.jsp");\r
-       //response.sendRedirect("/pages/login.jsp");\r
+       pageContext.forward("/pages/index.zul");\r
 %>
\ No newline at end of file
index 6d4c1725a26de0d8a7c8fffde6c05aca43031a0b..765a5bf3e18da5df2bcc430d514971ff11368a10 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c" ?>\r
-<?init class="user.jobengine.zk.util.AuthInitiator"?>\r
+<?init class="user.jobengine.zk.util.AdminAuthInitiator"?>\r
 <zk xmlns:w="http://www.zkoss.org/2005/zk/client" xmlns:ca="client/attribute">\r
 <style>\r
 .z-progressmeter {\r
index d402d7bf530910c741984eb465ecb832ada88fc6..371f924f2cbd8e7eecbfe15f9b5ae78342f3a445 100644 (file)
@@ -1,4 +1,8 @@
-<%@ page import="java.util.*, java.io.*, java.net.*"%><%\r
+<%@ page import="java.util.*, java.io.*, java.net.*, user.jobengine.zk.util.SessionUtil"%>\r
+<%\r
        //do login ++++\r
-       pageContext.forward("/pages/index.zul");\r
+       if (SessionUtil.isAuthenticated())\r
+               pageContext.forward("/pages/index.zul");\r
+       else\r
+               pageContext.forward("/pages/login.zul");\r
 %>
\ No newline at end of file
diff --git a/server/user.jobengine.osgi.server/pages/login.zul b/server/user.jobengine.osgi.server/pages/login.zul
new file mode 100644 (file)
index 0000000..6fa93ee
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<zk>\r
+<hbox self="@define(content)" vflex="1" hflex="1" align="center" pack="center" spacing="20px">\r
+        <vlayout>\r
+            <window id="loginWin" apply="org.zkoss.bind.BindComposer" viewModel="@id('jlm') @init('user.jobengine.zk.model.LoginModel')"\r
+                border="normal" hflex="min">\r
+                               <caption>\r
+                               \r
+                                       <toolbarbutton image="/img/mediacube_logo_v2_50x50.png"  onClick='' />\r
+                       </caption>                \r
+                <vbox hflex="min" align="center">\r
+                    <grid hflex="min">\r
+                        <columns>\r
+                            <column hflex="min" align="right" />\r
+                            <column />\r
+                        </columns>\r
+                        <rows>\r
+                            <row>\r
+                                Tartomány\r
+                                <label id="domain" width="200px" value="intra.echotv.hu" />\r
+                            </row>\r
+                            <row>\r
+                                Felhasználó\r
+                                <textbox value="@bind(jlm.account)" id="account" width="200px" forward="onOK=login.onClick" />\r
+                            </row>\r
+                            <row>\r
+                                Jelszó\r
+                                <textbox value="@bind(jlm.password)" id="password" type="password" width="200px" forward="onOK=login.onClick" />\r
+                            </row>\r
+                        </rows>\r
+                    </grid>\r
+                    <label id="message" sclass="warn" value="@bind(jlm.message)" />\r
+                    <button id="login" label="Bejelentkezés" onClick="@command('authenticate')"/>\r
+                </vbox>\r
+            </window>\r
+        </vlayout>\r
+    </hbox>\r
+</zk>
\ No newline at end of file
index 0cb794fba1f01b509b2fd5cc916fc2dd460bcad5..1e16a07cf630d445ebbd7701e2e0982d88e187a6 100644 (file)
@@ -60,8 +60,9 @@
                <menu sclass="whitemenu" label="Archívum" >\r
                        <menupopup>\r
                                <menuitem sclass="rozsda" label="Keresés" onClick='includeContent.src="/pages/search_items.zul"' disabled="false" />\r
-<!--                           <menuitem sclass="rozsda" label="Statisztikák" onClick='includeContent.src="/pages/statistics.zul"' disabled="false" /> -->\r
-<!--                           <menuitem sclass="rozsda" label="Folyamatok" onClick='includeContent.src="/pages/joblist.zul"' disabled="false" /> -->\r
+                               <menuitem sclass="rozsda" label="Statisztikák" onClick='includeContent.src="/pages/statistics.zul"' disabled="${not sessionScope.userPrincipal.admin}" />\r
+                               <menuitem sclass="rozsda" label="Folyamatok" onClick='includeContent.src="/pages/joblist.zul"' disabled="${not sessionScope.userPrincipal.admin}" />\r
+                               <menuitem sclass="rozsda" label="Hiányzó anyagok" onClick='includeContent.src="/pages/missingmaterials.zul"' disabled="${not sessionScope.userPrincipal.jobSubmitter}" />\r
                        </menupopup>\r
                </menu>\r
 \r
index e064d2471fae31e321657cdcee6cf9b62d8daefe..0e48fb6e5a8f6d210cdbdbaea70e378cbf0b20d8 100644 (file)
                        <west border="none" size="25%" splittable="true" minsize="250">\r
                                <div height="100%" width="100%">\r
                                        <groupbox vflex="min" closable="false">\r
-<!--                                           <caption sclass="boldfont" label="Kereső" /> -->\r
-                                               <textbox style="border:none" instant="true" value="@bind(svm.searchValue)" width="100%" tooltiptext="Gépelje be a keresendő kifejezést és nyomja meg az Enter-t."\r
-                                                       onOK="@command('doSearch')" />\r
+                                               <!--                                            <caption sclass="boldfont" label="Kereső" /> -->\r
+                                               <textbox style="border:none" instant="true" value="@bind(svm.searchValue)" width="100%"\r
+                                                       tooltiptext="Gépelje be a keresendő kifejezést és nyomja meg az Enter-t." onOK="@command('doSearch')" />\r
                                                <!--                                            <button sclass="buttonboldfont" label="${labels.button_search}" onClick="@command('doSearch')" autodisable="self" /> -->\r
                                        </groupbox>\r
 \r
                                        <groupbox vflex="true" closable="false">\r
                                                <caption sclass="boldfont" label="Gyűjtők" />\r
+\r
+<!--                                           <grid id="itemResults" sizedByContent="false" span="true" model="@load(svm.searchResult)" autopaging="true" -->\r
+<!--                                                   mold="paging" vflex="true" style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" -->\r
+<!--                                                   sclass="listbox-normal-style"> -->\r
+<!--                                                   <columns> -->\r
+<!--                                                           <column label="ID" hflex="1" align="left" /> -->\r
+<!--                                                           <column label="Cím" hflex="6" align="left" /> -->\r
+<!--                                                   </columns> -->\r
+<!--                                                   <rows> -->\r
+<!--                                                           <template name="model"> -->\r
+<!--                                                                   <row> -->\r
+<!--                                                                           <label value="@load(each.houseId)" /> -->\r
+<!--                                                                           <label value="@load(each.title)" /> -->\r
+<!--                                                                   </row> -->\r
+<!--                                                           </template> -->\r
+<!--                                                   </rows> -->\r
+<!--                                           </grid> -->\r
+                                               \r
                                                <listbox id="itemResults" sizedByContent="false" span="true" model="@load(svm.searchResult)" multiple="false" autopaging="true"\r
                                                        mold="paging" vflex="true" selectedItem="@bind(svm.selectedItem)" style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style"\r
                                                        sclass="listbox-normal-style">\r
                                                                <div>\r
                                                                        <label style="font-size:8pt; color: gray" value="Média leírása" />\r
                                                                        <div style="margin: 4px">\r
-                                                                               <label value="@load(svm.selectedMedia.description)" />\r
+                                                                               <label multiline="true" value="@load(svm.selectedMedia.description)" />\r
                                                                        </div>\r
                                                                </div>\r
                                                        </div>\r
index 4089aa3a2e1b0cefe8a919dbc4f4850c0d4a0c4d..5ba664c1a7a6c586f588861f7b2c610444e917c5 100644 (file)
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
+<?init class="user.jobengine.zk.util.AdminAuthInitiator"?>\r
 <window apply="user.jobengine.zk.model.StatisticsComposer"\r
        contentStyle="overflow:auto;" width="100%" height="100%"> <vlayout>\r
 \r
index 883e32c60e59a0a895d46a31d931e8ecb71c2447..4ad7d14b9b628f6515747bceef0e51c7269762f8 100644 (file)
@@ -11,8 +11,9 @@ public class ArchiveItem implements Serializable {
        private String mediaHouseId;\r
        private String mediaTitle;\r
        private String mediaDescription;\r
-       private String mediaFile = null;\r
-       private String catchedFile = null;\r
+       private String mediaFile;\r
+       private String catchedFile;\r
+       private String mediaType;\r
        private long duration;\r
 \r
        public String getCatchedFile() {\r
@@ -51,6 +52,10 @@ public class ArchiveItem implements Serializable {
                return mediaTitle;\r
        }\r
 \r
+       public String getMediaType() {\r
+               return mediaType;\r
+       }\r
+\r
        public boolean removeCatchedFile() {\r
                boolean result = false;\r
                if (catchedFile != null) {\r
@@ -96,4 +101,8 @@ public class ArchiveItem implements Serializable {
        public void setMediaTitle(String mediaTitle) {\r
                this.mediaTitle = mediaTitle;\r
        }\r
+\r
+       public void setMediaType(String mediaType) {\r
+               this.mediaType = mediaType;\r
+       }\r
 }\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/server/steps/LogCollector.java b/server/user.jobengine.osgi.server/src/user/jobengine/server/steps/LogCollector.java
new file mode 100644 (file)
index 0000000..09afb95
--- /dev/null
@@ -0,0 +1,106 @@
+package user.jobengine.server.steps;\r
+\r
+public class LogCollector {\r
+}\r
+//public class LogCollector extends Logger {\r
+//\r
+//     class CollectedMessage {\r
+//             private String message;\r
+//             private Level level;\r
+//\r
+//             CollectedMessage(Level level, Message message) {\r
+//                     this.level = level;\r
+//                     this.message = message.getFormattedMessage();\r
+//             }\r
+//\r
+//             @Override\r
+//             public String toString() {\r
+//                     return String.format("%s %s\r\n", level, message);\r
+//             }\r
+//     }\r
+//\r
+//     private static final String LOGCOLLECTOR_FINISH = "LOGCOLLECTOR_FINISH";\r
+//     public static Marker FINISH = MarkerManager.getMarker(LOGCOLLECTOR_FINISH);\r
+//\r
+//     public static org.apache.logging.log4j.Logger getLogger() {\r
+//             Logger logger = (Logger) LogManager.getLogger(ReflectionUtil.getCallerClass(2));\r
+//             LogCollector result = new LogCollector(logger.getContext(), logger.getName(), logger.getMessageFactory());\r
+//             return result;\r
+//     }\r
+//\r
+//     private Map<Marker, List<CollectedMessage>> messages = new HashMap<>();\r
+//\r
+//     protected LogCollector(LoggerContext context, String name, MessageFactory messageFactory) {\r
+//             super(context, name, messageFactory);\r
+//             //Map<String, Appender> appenders = super.getAppenders();\r
+//     }\r
+//\r
+//     private void collect(Marker marker, Level level, Message message) {\r
+//             //LogEvent event = Log4jLogEvent.newBuilder().setMessage(message).setMarker(marker).setLevel(level).setLoggerName(super.getName()).build();\r
+//             List<CollectedMessage> msgList = messages.get(marker);\r
+//             if (msgList == null) {\r
+//                     msgList = new ArrayList<>();\r
+//                     messages.put(marker, msgList);\r
+//             }\r
+//             msgList.add(new CollectedMessage(level, message));\r
+//     }\r
+//\r
+//     @Override\r
+//     public void error(Marker marker, String message) {\r
+//             Message msg = getMessageFactory().newMessage(message);\r
+//             collect(marker, Level.ERROR, msg);\r
+//             super.error(marker, message);\r
+//     }\r
+//\r
+//     @Override\r
+//     public void error(Marker marker, String message, Object... params) {\r
+//             Message msg = getMessageFactory().newMessage(message, params);\r
+//             collect(marker, Level.ERROR, msg);\r
+//             super.error(marker, message, params);\r
+//     }\r
+//\r
+//     private void finish() {\r
+//             Set<Marker> markers = messages.keySet();\r
+//             for (Marker marker : markers) {\r
+//                     List<CollectedMessage> msgList = messages.get(marker);\r
+//                     StringBuilder sb = new StringBuilder();\r
+//                     for (CollectedMessage msg : msgList) {\r
+//                             sb.append(msg.toString());\r
+//                     }\r
+//                     super.info(marker, sb.toString());\r
+//             }\r
+//             messages.clear();\r
+//     }\r
+//\r
+//     @Override\r
+//     public void info(Marker marker, String message) {\r
+//             Message msg = getMessageFactory().newMessage(message);\r
+//             collect(marker, Level.INFO, msg);\r
+//     }\r
+//\r
+//     @Override\r
+//     public void info(Marker marker, String message, Object... params) {\r
+//             Message msg = getMessageFactory().newMessage(message, params);\r
+//             collect(marker, Level.INFO, msg);\r
+//     }\r
+//\r
+//     @Override\r
+//     public void info(Object message) {\r
+//             if (message instanceof Marker && LOGCOLLECTOR_FINISH.equals(((Marker) message).getName())) {\r
+//                     finish();\r
+//                     return;\r
+//             }\r
+//     }\r
+//\r
+//     @Override\r
+//     public void warn(Marker marker, String message) {\r
+//             Message msg = getMessageFactory().newMessage(message);\r
+//             collect(marker, Level.WARN, msg);\r
+//     }\r
+//\r
+//     @Override\r
+//     public void warn(Marker marker, String message, Object... params) {\r
+//             Message msg = getMessageFactory().newMessage(message, params);\r
+//             collect(marker, Level.WARN, msg);\r
+//     }\r
+//}\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/LineFeedConverter.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/LineFeedConverter.java
new file mode 100644 (file)
index 0000000..a5c0448
--- /dev/null
@@ -0,0 +1,19 @@
+package user.jobengine.zk.model;\r
+\r
+import org.zkoss.bind.BindContext;\r
+import org.zkoss.bind.Converter;\r
+import org.zkoss.zk.ui.Component;\r
+\r
+public class LineFeedConverter implements Converter {\r
+\r
+       @Override\r
+       public Object coerceToBean(Object val, Component comp, BindContext ctx) {\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public Object coerceToUi(Object val, Component comp, BindContext ctx) {\r
+               return String.valueOf(val).replace("\r\n", "</br>");\r
+       }\r
+\r
+}\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/LoginModel.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/LoginModel.java
new file mode 100644 (file)
index 0000000..d4481eb
--- /dev/null
@@ -0,0 +1,64 @@
+package user.jobengine.zk.model;\r
+\r
+import java.io.IOException;\r
+\r
+import org.zkoss.bind.annotation.AfterCompose;\r
+import org.zkoss.bind.annotation.Command;\r
+import org.zkoss.bind.annotation.ContextParam;\r
+import org.zkoss.bind.annotation.ContextType;\r
+import org.zkoss.bind.annotation.Init;\r
+import org.zkoss.bind.annotation.NotifyChange;\r
+import org.zkoss.zk.ui.Component;\r
+import org.zkoss.zk.ui.Executions;\r
+\r
+import user.jobengine.zk.util.SessionUtil;\r
+\r
+public class LoginModel extends BaseModel {\r
+       private String account;\r
+       private String password;\r
+       private String message;\r
+\r
+       @AfterCompose\r
+       public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
+       }\r
+\r
+       @Command\r
+       @NotifyChange({ "message" })\r
+       public void authenticate() throws IOException {\r
+               if (!SessionUtil.authenticate(account, password)) {\r
+                       setMessage("Hibás fiókadatok!");\r
+                       return;\r
+               }\r
+               Executions.sendRedirect("/");\r
+       }\r
+\r
+       public String getAccount() {\r
+               return account;\r
+       }\r
+\r
+       public String getMessage() {\r
+               return message;\r
+       }\r
+\r
+       public String getPassword() {\r
+               return password;\r
+       }\r
+\r
+       @Init\r
+       public void init() {\r
+               setMessage("Kérem adja meg fiókadatait.");\r
+       }\r
+\r
+       public void setAccount(String account) {\r
+               this.account = account;\r
+       }\r
+\r
+       public void setMessage(String message) {\r
+               this.message = message;\r
+       }\r
+\r
+       public void setPassword(String password) {\r
+               this.password = password;\r
+       }\r
+\r
+}
\ No newline at end of file
index df2aa82f53cc19391d970769419b86a6a5bbc7f3..af423de1d990349210e0681a43f20f17d943ee8f 100644 (file)
@@ -7,6 +7,8 @@ import org.zkoss.zk.ui.select.annotation.Wire;
 import org.zkoss.zul.Include;\r
 import org.zkoss.zul.Window;\r
 \r
+import user.jobengine.zk.util.SessionUtil;\r
+\r
 public class MenuModel extends BaseModel {\r
 \r
        @Wire\r
@@ -19,10 +21,10 @@ public class MenuModel extends BaseModel {
 \r
        @Command\r
        public void doLogout(@BindingParam("window") Window window) {\r
-               //              SessionUtil.setAttribute(SessionUtil.PRINCIPALNAME, null);\r
+               SessionUtil.logout();\r
                //              SessionUtil.setAttribute(SessionUtil.USERPROFILE, null);\r
-               window.detach();\r
-               //Executions.sendRedirect("/ready.zul");\r
+               //window.detach();\r
+               Executions.sendRedirect("/");\r
                //includeContent.setSrc("/pages/joblist.zul");\r
        }\r
 \r
index 2c4bf4d6148c8993956e11c0ef79ce60f8e2a92b..03b771422e44b350835cdf6c5a7504bd73ce6045 100644 (file)
@@ -9,6 +9,7 @@ import java.util.Map;
 import org.apache.commons.lang.StringUtils;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
+import org.zkoss.bind.Converter;\r
 import org.zkoss.bind.annotation.BindingParam;\r
 import org.zkoss.bind.annotation.Command;\r
 import org.zkoss.bind.annotation.NotifyChange;\r
@@ -34,6 +35,7 @@ public class SearchModel extends BaseModel {
        protected CachedListModel searchResult = null;\r
        private Item selectedItem = null;\r
        private Media selectedMedia = null;\r
+       private Converter lfConverter = new LineFeedConverter();\r
 \r
        @Command\r
        @NotifyChange({ "mold", "paging", "searchResult", "selectedItem", "selectedMedia", "hasLowresMediaFile" })\r
@@ -92,6 +94,10 @@ public class SearchModel extends BaseModel {
                return ret;\r
        }\r
 \r
+       public Converter getLfConverter() {\r
+               return lfConverter;\r
+       }\r
+\r
        public String getLowresMediaFilePath() throws Exception {\r
                String ret = "";\r
                if (this.selectedMedia != null) {\r
@@ -148,7 +154,7 @@ public class SearchModel extends BaseModel {
                        }\r
                        return ret;\r
                }\r
-\r
+       \r
                public boolean getHasSelectedMediaFile(){\r
                        String mediaFilePath =getMediaFilePath();\r
                        return (mediaFilePath != null && !"".equals(mediaFilePath));\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/util/ADHandler.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/util/ADHandler.java
new file mode 100644 (file)
index 0000000..f93b738
--- /dev/null
@@ -0,0 +1,326 @@
+package user.jobengine.zk.util;\r
+\r
+import java.util.Hashtable;\r
+import java.util.Properties;\r
+import java.util.Vector;\r
+\r
+import javax.naming.Context;\r
+import javax.naming.NamingEnumeration;\r
+import javax.naming.directory.Attribute;\r
+import javax.naming.directory.Attributes;\r
+import javax.naming.directory.SearchControls;\r
+import javax.naming.directory.SearchResult;\r
+import javax.naming.ldap.InitialLdapContext;\r
+import javax.naming.ldap.LdapContext;\r
+\r
+public class ADHandler {\r
+       static private Properties cfg = null;\r
+\r
+       synchronized static public void get(String cn, Vector<String> ret) throws Exception {\r
+               LdapContext ctx = null;\r
+               NamingEnumeration<SearchResult> answer = null;\r
+               try {\r
+                       ctx = getContext();\r
+                       SearchControls searchCtls = new SearchControls();\r
+                       searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
+                       String searchFilter = "(&(CN=" + cn + "))";\r
+                       String searchBase = cfg.getProperty("ad_base_dn");\r
+                       answer = ctx.search(searchBase, searchFilter, searchCtls);\r
+                       if (answer.hasMoreElements()) {\r
+                               SearchResult sr = answer.next();\r
+                               Attributes srAttrs = sr.getAttributes();\r
+                               Attribute groupMembers = srAttrs.get("memberOf");\r
+                               if (groupMembers != null) {\r
+                                       for (int i = 0; i < groupMembers.size(); i++) {\r
+                                               String groupName = groupMembers.get(i).toString();\r
+                                               String[] parts = groupName.split(",");\r
+                                               groupName = parts[0];\r
+                                               if (groupName.indexOf("=") > 0) {\r
+                                                       groupName = groupName.substring(groupName.indexOf("=") + 1); //CN=icmadmin,CN=Users,DC=dev2003,DC=user,DC=hu\r
+                                               }\r
+                                               if (!ret.contains(groupName) && groupName.matches(cfg.getProperty("ad_groupname_regexp"))) {\r
+                                                       ret.add(groupName);\r
+\r
+                                                       //RECURSIVE CALL\r
+                                                       getADGroupsForCN(groupName, ret);\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+               } finally {\r
+                       try {\r
+                               if (answer != null)\r
+                                       answer.close();\r
+                               if (ctx != null)\r
+                                       ctx.close();\r
+                       } catch (Exception exc) {\r
+                       }\r
+               }\r
+       }\r
+\r
+       synchronized static public void getADGroupsForCN(String cn, Vector<String> ret) throws Exception {\r
+               LdapContext ctx = null;\r
+               NamingEnumeration<SearchResult> answer = null;\r
+               try {\r
+                       ctx = getContext();\r
+                       SearchControls searchCtls = new SearchControls();\r
+                       searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
+                       String searchFilter = "(&(CN=" + cn + "))";\r
+                       String searchBase = cfg.getProperty("ad_base_dn");\r
+                       answer = ctx.search(searchBase, searchFilter, searchCtls);\r
+                       if (answer.hasMoreElements()) {\r
+                               SearchResult sr = answer.next();\r
+                               Attributes srAttrs = sr.getAttributes();\r
+                               Attribute groupMembers = srAttrs.get("memberOf");\r
+                               if (groupMembers != null) {\r
+                                       for (int i = 0; i < groupMembers.size(); i++) {\r
+                                               String groupName = groupMembers.get(i).toString();\r
+                                               String[] parts = groupName.split(",");\r
+                                               groupName = parts[0];\r
+                                               if (groupName.indexOf("=") > 0) {\r
+                                                       groupName = groupName.substring(groupName.indexOf("=") + 1); //CN=icmadmin,CN=Users,DC=dev2003,DC=user,DC=hu\r
+                                               }\r
+                                               if (!ret.contains(groupName) && groupName.matches(cfg.getProperty("ad_groupname_regexp"))) {\r
+                                                       ret.add(groupName);\r
+\r
+                                                       //RECURSIVE CALL\r
+                                                       getADGroupsForCN(groupName, ret);\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+               } finally {\r
+                       try {\r
+                               if (answer != null)\r
+                                       answer.close();\r
+                               if (ctx != null)\r
+                                       ctx.close();\r
+                       } catch (Exception exc) {\r
+                       }\r
+               }\r
+       }\r
+\r
+       /**\r
+        * Minden AD csoport els� CN nev�t adja vissza.\r
+        */\r
+\r
+       static public void getAllADGroupName(Vector ret) throws Exception {\r
+\r
+               LdapContext ctx = null;\r
+               NamingEnumeration answer = null;\r
+               try {\r
+                       //Create the initial directory context\r
+                       ctx = getContext();\r
+\r
+                       //Create the search controls\r
+                       SearchControls searchCtls = new SearchControls();\r
+\r
+                       //Specify the search scope\r
+                       searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
+\r
+                       //specify the LDAP search filter\r
+                       String searchFilter = "(&(objectClass=group))"; //(CN=All Research)\r
+\r
+                       //Specify the Base for the search\r
+                       String searchBase = cfg.getProperty("ad_base_dn");\r
+\r
+                       //initialize counter to total the group members\r
+                       int totalResults = 0;\r
+\r
+                       //Specify the attributes to return\r
+                       String returnedAtts[] = { "member" };\r
+                       searchCtls.setReturningAttributes(returnedAtts);\r
+\r
+                       //Search for objects using the filter\r
+                       answer = ctx.search(searchBase, searchFilter, searchCtls);\r
+\r
+                       //Loop through the search results\r
+                       while (answer.hasMoreElements()) {\r
+                               SearchResult sr = (SearchResult) answer.next();\r
+                               String grpname = sr.getName();\r
+                               String[] parts = grpname.split(",");\r
+                               String[] firstCn = parts[0].split("=");\r
+                               ret.add(firstCn[1]);\r
+                       }\r
+\r
+               } catch (Exception e) {\r
+               } finally {\r
+                       try {\r
+                               if (answer != null)\r
+                                       answer.close();\r
+                               if (ctx != null)\r
+                                       ctx.close();\r
+                       } catch (Exception exc) {\r
+                       }\r
+               }\r
+       }\r
+\r
+       synchronized static public String getAllFromAD(String name) throws Exception {\r
+\r
+               //if(1==1) return "-";\r
+\r
+               String fullName = "";\r
+               LdapContext ctx = null;\r
+               NamingEnumeration answer = null;\r
+               try {\r
+                       //Create the initial directory context\r
+                       ctx = getContext();\r
+\r
+                       //Create the search controls\r
+                       SearchControls searchCtls = new SearchControls();\r
+\r
+                       //Specify the search scope\r
+                       searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
+\r
+                       //Specify the LDAP search filter\r
+                       String searchFilter = "(&(objectClass=person)(objectCategory=Person)(CN=" + name + "))"; //p�ld�k: "(&(objectClass=person)(objectCategory=Person)(CN=y011216s))";   "(&(objectClass=group)(objectCategory=Group)(CN=Users))";\r
+\r
+                       //Specify the Base for the search\r
+                       String searchBase = cfg.getProperty("ad_base_dn");\r
+\r
+                       //Specify the attributes to return\r
+                       //String returnedAtts[]={"memberOf"};                   //"member"\r
+                       //searchCtls.setReturningAttributes(returnedAtts);\r
+\r
+                       //Search for objects using the filter\r
+                       answer = ctx.search(searchBase, searchFilter, searchCtls);\r
+\r
+                       //Loop through the search results\r
+                       if (answer.hasMoreElements()) {\r
+                               SearchResult sr = (SearchResult) answer.next();\r
+                               Attributes srAttrs = sr.getAttributes();\r
+\r
+                               for (NamingEnumeration<?> enu = srAttrs.getAll(); enu.hasMore();) {\r
+                                       Attribute attr = (Attribute) enu.next();\r
+                                       //System.out.println(attr);\r
+                                       if (attr != null) {\r
+                                               System.out.println("attrib: " + attr.getID() + " : " + attr.get(0).toString());\r
+                                       }\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       System.out.println(e.getMessage());\r
+               } finally {\r
+                       try {\r
+                               if (answer != null)\r
+                                       answer.close();\r
+                               if (ctx != null)\r
+                                       ctx.close();\r
+                       } catch (Exception exc) {\r
+                       }\r
+               }\r
+               return fullName;\r
+       }\r
+\r
+       synchronized static public LdapContext getContext() throws Exception {\r
+\r
+               String adminName = cfg.getProperty("ad_nonsecure_user_dn") + "," + cfg.getProperty("ad_base_dn");\r
+               String adminPassword = cfg.getProperty("ad_nonsecure_user_password");\r
+               String ldapURL = "ldap://" + cfg.getProperty("ad_host") + ":" + cfg.getProperty("ad_nonsecureport");\r
+\r
+               Hashtable env = new Hashtable();\r
+               env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");\r
+               //set security credentials, note using simple cleartext authentication\r
+               env.put(Context.SECURITY_AUTHENTICATION, "simple");\r
+               //env.put(Context.SECURITY_PRINCIPAL, adminName);\r
+               env.put(Context.SECURITY_PRINCIPAL, "echotest@intra.echotv.hu");\r
+               env.put(Context.SECURITY_CREDENTIALS, adminPassword);\r
+               //connect to my domain controller\r
+               env.put(Context.PROVIDER_URL, ldapURL);\r
+\r
+               //Create the initial directory context\r
+               LdapContext ctx = new InitialLdapContext(env, null);\r
+               return ctx;\r
+       }\r
+\r
+       synchronized static public String getDisplayName(String name) throws Exception {\r
+               String fullName = "";\r
+               LdapContext ctx = null;\r
+               NamingEnumeration<SearchResult> answer = null;\r
+               try {\r
+                       ctx = getContext();\r
+                       SearchControls searchCtls = new SearchControls();\r
+                       searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
+                       String searchFilter = "(&(objectClass=person)(objectCategory=Person)(CN=" + name + "))";\r
+                       String searchBase = cfg.getProperty("ad_base_dn");\r
+                       answer = ctx.search(searchBase, searchFilter, searchCtls);\r
+                       if (answer.hasMoreElements()) {\r
+                               SearchResult sr = answer.next();\r
+                               Attribute attr = sr.getAttributes().get("displayName");\r
+                               if (attr != null) {\r
+                                       return attr.get(0).toString();\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       System.out.println(e.getMessage());\r
+               } finally {\r
+                       try {\r
+                               if (answer != null)\r
+                                       answer.close();\r
+                               if (ctx != null)\r
+                                       ctx.close();\r
+                       } catch (Exception exc) {\r
+                       }\r
+               }\r
+               return fullName;\r
+       }\r
+\r
+       synchronized static public String getMail(String name) throws Exception {\r
+               String fullName = "";\r
+               LdapContext ctx = null;\r
+               NamingEnumeration<SearchResult> answer = null;\r
+               try {\r
+                       ctx = getContext();\r
+                       SearchControls searchCtls = new SearchControls();\r
+                       searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
+                       String searchFilter = "(&(objectClass=person)(objectCategory=Person)(CN=" + name + "))";\r
+                       String searchBase = cfg.getProperty("ad_base_dn");\r
+                       answer = ctx.search(searchBase, searchFilter, searchCtls);\r
+                       if (answer.hasMoreElements()) {\r
+                               SearchResult sr = answer.next();\r
+                               Attribute attr = sr.getAttributes().get("userPrincipalName");\r
+                               if (attr != null) {\r
+                                       return attr.get(0).toString();\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       System.out.println(e.getMessage());\r
+               } finally {\r
+                       try {\r
+                               if (answer != null)\r
+                                       answer.close();\r
+                               if (ctx != null)\r
+                                       ctx.close();\r
+                       } catch (Exception exc) {\r
+                       }\r
+               }\r
+               return fullName;\r
+       }\r
+\r
+       //TEST CODE\r
+       public static void main(String[] args) {\r
+               try {\r
+                       Properties config = new Properties();\r
+                       config.setProperty("ad_host", "10.10.254.11");\r
+                       config.setProperty("ad_nonsecureport", "389");\r
+                       config.setProperty("ad_base_dn", "DC=intra,DC=echotv,DC=hu");\r
+                       config.setProperty("ad_nonsecure_user_dn", "CN=echotest,CN=Users");\r
+                       config.setProperty("ad_nonsecure_user_password", "aA123456+");\r
+                       ADHandler.setConfig(config);\r
+\r
+                       ADHandler.getMail("echotest");\r
+                       System.out.println("Display name: " + ADHandler.getDisplayName("echotest"));\r
+                       Vector groups = new Vector();\r
+                       ADHandler.getADGroupsForCN("echotest", groups);\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+       }\r
+\r
+       static public void setConfig(Properties _cfg) {\r
+               ADHandler.cfg = _cfg;\r
+       }\r
+\r
+}
\ No newline at end of file
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/util/AdminAuthInitiator.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/util/AdminAuthInitiator.java
new file mode 100644 (file)
index 0000000..2d599fb
--- /dev/null
@@ -0,0 +1,20 @@
+package user.jobengine.zk.util;\r
+\r
+import java.util.Map;\r
+\r
+import org.zkoss.zk.ui.Executions;\r
+import org.zkoss.zk.ui.Page;\r
+import org.zkoss.zk.ui.util.Initiator;\r
+\r
+public class AdminAuthInitiator implements Initiator {\r
+\r
+       @Override\r
+       public void doInit(Page page, Map<String, Object> args) throws Exception {\r
+               if (!SessionUtil.isAuthenticated())\r
+                       Executions.sendRedirect("/pages/login.jsp");\r
+\r
+               if (!SessionUtil.isAdmin())\r
+                       Executions.sendRedirect("/");\r
+       }\r
+\r
+}
\ No newline at end of file
index 218466b044ac4715a2b622b65b39d833dbe6c2ec..dad1518aa9ba7e867e809c6896b3e61527d7d88c 100644 (file)
@@ -2,6 +2,7 @@ package user.jobengine.zk.util;
 \r
 import java.util.Map;\r
 \r
+import org.zkoss.zk.ui.Executions;\r
 import org.zkoss.zk.ui.Page;\r
 import org.zkoss.zk.ui.util.Initiator;\r
 \r
@@ -9,14 +10,10 @@ import org.zkoss.zk.ui.util.Initiator;
  * Ellenorzi, hogy van e beloginelt user, ha nincs, akkor -> login.zul Minden oldal belinkeli ezt az ellenorzest.\r
  */\r
 public class AuthInitiator implements Initiator {\r
-\r
        @Override\r
        public void doInit(Page page, Map<String, Object> args) throws Exception {\r
-               //nincs beloginelt felhasznalo\r
-               //      if(SessionUtil.getAttribute(SessionUtil.PRINCIPALNAME) == null){\r
-               //              Executions.sendRedirect("/index.jsp");\r
-               //              return;\r
-               //      }\r
+               if (!SessionUtil.isAuthenticated())\r
+                       Executions.sendRedirect("/pages/login.jsp");\r
        }\r
 \r
 }
\ No newline at end of file
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/util/LDAPHandler.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/util/LDAPHandler.java
new file mode 100644 (file)
index 0000000..36ad626
--- /dev/null
@@ -0,0 +1,230 @@
+package user.jobengine.zk.util;\r
+\r
+import java.io.FileInputStream;\r
+import java.lang.invoke.MethodHandles;\r
+import java.net.URL;\r
+import java.util.ArrayList;\r
+import java.util.Hashtable;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+import java.util.Properties;\r
+import java.util.Set;\r
+\r
+import javax.naming.Context;\r
+import javax.naming.NamingEnumeration;\r
+import javax.naming.NamingException;\r
+import javax.naming.directory.Attribute;\r
+import javax.naming.directory.Attributes;\r
+import javax.naming.directory.SearchControls;\r
+import javax.naming.directory.SearchResult;\r
+import javax.naming.ldap.InitialLdapContext;\r
+import javax.naming.ldap.LdapContext;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.ListUtils;\r
+\r
+public class LDAPHandler {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String LDAP_ADDRESS = "ldap://%s:%s";\r
+       private static final String AD_NONSECUREPORT = "ad_nonsecureport";\r
+       private static final String AD_HOST = "ad_host";\r
+       private static final String SIMPLE_AUTH = "simple";\r
+       private static final String CTX_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";\r
+       private static final String DOMAIN_ACCOUNT = "%s@%s";\r
+       private static final String MAIL = "mail";\r
+       private static final String DISPLAY_NAME = "displayName";\r
+       private static final String MEMBER_OF = "memberOf";\r
+       private static final String AD_BASE_DN = "ad_base_dn";\r
+\r
+       public static void main(String[] args) throws Exception {\r
+               //              Properties cfg = new Properties();\r
+               //              cfg.setProperty("ad_host", "10.10.254.11");\r
+               //              cfg.setProperty("ad_nonsecureport", "389");\r
+               //              cfg.setProperty("ad_base_dn", "DC=intra,DC=echotv,DC=hu");\r
+\r
+               Properties cfg = new Properties();\r
+               URL srcLocation = MethodHandles.lookup().lookupClass().getProtectionDomain().getCodeSource().getLocation();\r
+               URL location = new URL(srcLocation, "../../-configuration/mediacube-auth.properties");\r
+               cfg.load(new FileInputStream(location.toURI().getPath().toString()));\r
+\r
+               //LDAPHandler h = new LDAPHandler("echotest", "aA123456+", cfg);\r
+               //LDAPHandler h = new LDAPHandler("stibor.adm", "Qwer1234", cfg);\r
+               LDAPHandler h = new LDAPHandler("nagy.ilona", "k0rianDER", cfg);\r
+\r
+               UserPrincipal user = h.getUserPrincipal();\r
+               System.out.println(user);\r
+               //List<String> allGroups = h.getAllGroups();\r
+       }\r
+\r
+       private Properties cfg = null;\r
+       private String account;\r
+       private String password;\r
+       private String domain;\r
+\r
+       public LDAPHandler(String account, String password, Properties cfg) {\r
+               this.account = account;\r
+               this.password = password;\r
+               this.domain = cfg.getProperty(AD_BASE_DN);\r
+               if (domain != null)\r
+                       domain = domain.toLowerCase().replace("dc=", "").replace(",", ".");\r
+               this.cfg = cfg;\r
+       }\r
+\r
+       public List<String> getAllGroups() {\r
+               List<String> result = new ArrayList<>();\r
+               LdapContext ctx = null;\r
+               NamingEnumeration<SearchResult> answer = null;\r
+               try {\r
+                       ctx = getContext();\r
+                       SearchControls searchCtls = new SearchControls();\r
+                       searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
+                       String searchFilter = "(&(objectClass=group))";\r
+                       String searchBase = cfg.getProperty(AD_BASE_DN);\r
+                       String returnedAtts[] = { "member" };\r
+                       searchCtls.setReturningAttributes(returnedAtts);\r
+                       answer = ctx.search(searchBase, searchFilter, searchCtls);\r
+                       while (answer.hasMoreElements()) {\r
+                               SearchResult sr = answer.next();\r
+                               String grpname = sr.getName();\r
+                               String[] parts = grpname.split(",");\r
+                               String[] firstCn = parts[0].split("=");\r
+                               String groupName = firstCn[1];\r
+                               result.add(groupName);\r
+                               System.out.println(groupName);\r
+\r
+                               //                              List<String> parentGroups = getMemberOf(ctx, groupName);\r
+                               //                              for (String group : parentGroups)\r
+                               //                                      System.out.println("\t" + group);\r
+\r
+                       }\r
+\r
+               } catch (Exception e) {\r
+               } finally {\r
+                       try {\r
+                               if (answer != null)\r
+                                       answer.close();\r
+                               if (ctx != null)\r
+                                       ctx.close();\r
+                       } catch (Exception exc) {\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private LdapContext getContext() throws Exception {\r
+               Hashtable<String, String> env = new Hashtable<>();\r
+               String ldapURL = String.format(LDAP_ADDRESS, cfg.getProperty(AD_HOST), cfg.getProperty(AD_NONSECUREPORT));\r
+               env.put(Context.PROVIDER_URL, ldapURL);\r
+               env.put(Context.INITIAL_CONTEXT_FACTORY, CTX_FACTORY);\r
+               env.put(Context.SECURITY_AUTHENTICATION, SIMPLE_AUTH);\r
+               env.put(Context.SECURITY_PRINCIPAL, String.format(DOMAIN_ACCOUNT, account, domain));\r
+               env.put(Context.SECURITY_CREDENTIALS, password);\r
+\r
+               return new InitialLdapContext(env, null);\r
+       }\r
+\r
+       private List<String> getMemberOf(LdapContext ctx, String cn) {\r
+               List<String> result = new ArrayList<>();\r
+               NamingEnumeration<SearchResult> answer = null;\r
+               try {\r
+                       SearchControls searchCtls = new SearchControls();\r
+                       searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
+                       String searchFilter = "(&(CN=" + cn + "))";\r
+                       String searchBase = cfg.getProperty("ad_base_dn");\r
+                       answer = ctx.search(searchBase, searchFilter, searchCtls);\r
+                       if (answer.hasMoreElements()) {\r
+                               SearchResult sr = answer.next();\r
+                               Attributes srAttrs = sr.getAttributes();\r
+                               Attribute groupMembers = srAttrs.get("memberOf");\r
+                               if (groupMembers != null) {\r
+                                       for (int i = 0; i < groupMembers.size(); i++) {\r
+                                               String groupName = groupMembers.get(i).toString();\r
+                                               String[] parts = groupName.split(",");\r
+                                               groupName = parts[0];\r
+                                               if (groupName.indexOf("=") > 0) {\r
+                                                       groupName = groupName.substring(groupName.indexOf("=") + 1);\r
+                                                       if (!result.contains(groupName)) {\r
+                                                               result.add(groupName);\r
+                                                               List<String> parentGroups = getMemberOf(ctx, groupName);\r
+                                                               Set<String> parentSet = new LinkedHashSet<>(parentGroups);\r
+                                                               parentSet.addAll(result);\r
+                                                               result = new ArrayList<>(parentSet);\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+               } finally {\r
+                       try {\r
+                               if (answer != null)\r
+                                       answer.close();\r
+                       } catch (Exception exc) {\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       public UserPrincipal getUserPrincipal() {\r
+               UserPrincipal result = null;\r
+               LdapContext ctx = null;\r
+               NamingEnumeration<SearchResult> answer = null;\r
+               try {\r
+                       ctx = getContext();\r
+                       SearchControls searchCtls = new SearchControls();\r
+                       searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
+                       String searchFilter = "(&(CN=" + account + "))";\r
+                       String searchBase = cfg.getProperty(AD_BASE_DN);\r
+                       answer = ctx.search(searchBase, searchFilter, searchCtls);\r
+                       if (answer.hasMoreElements()) {\r
+                               result = new UserPrincipal(account);\r
+                               SearchResult sr = answer.next();\r
+                               Attributes srAttrs = sr.getAttributes();\r
+                               Attribute groupMembers = srAttrs.get(MEMBER_OF);\r
+                               if (groupMembers != null)\r
+                                       setMemberOf(result, groupMembers, ctx);\r
+\r
+                               Attribute displayName = srAttrs.get(DISPLAY_NAME);\r
+                               if (displayName != null)\r
+                                       result.setDisplayName(String.valueOf(displayName.get(0)));\r
+\r
+                               Attribute email = srAttrs.get(MAIL);\r
+                               if (email != null)\r
+                                       result.setEmail(String.valueOf(email.get(0)));\r
+\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               } finally {\r
+                       try {\r
+                               if (answer != null)\r
+                                       answer.close();\r
+                               if (ctx != null)\r
+                                       ctx.close();\r
+                       } catch (Exception exc) {\r
+                       }\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       private void setMemberOf(UserPrincipal userPrincipal, Attribute groupMembers, LdapContext ctx) throws NamingException {\r
+               List<String> memberOf = new ArrayList<>();\r
+               for (int i = 0; i < groupMembers.size(); i++) {\r
+                       String groupName = groupMembers.get(i).toString();\r
+                       String[] parts = groupName.split(",");\r
+                       groupName = parts[0];\r
+                       if (groupName.indexOf("=") > 0) {\r
+                               groupName = groupName.substring(groupName.indexOf("=") + 1);\r
+                               memberOf.add(groupName);\r
+\r
+                               List<String> parentGroups = getMemberOf(ctx, groupName);\r
+                               memberOf = ListUtils.distinctUnion(memberOf, parentGroups);\r
+                       }\r
+               }\r
+               userPrincipal.setMemberOf(memberOf, cfg);\r
+       }\r
+\r
+}
\ No newline at end of file
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/util/SessionUtil.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/util/SessionUtil.java
new file mode 100644 (file)
index 0000000..8c9066d
--- /dev/null
@@ -0,0 +1,124 @@
+package user.jobengine.zk.util;\r
+\r
+import java.io.FileInputStream;\r
+import java.io.InputStream;\r
+import java.util.Properties;\r
+\r
+import javax.servlet.http.HttpSession;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.zkoss.zk.ui.Session;\r
+import org.zkoss.zk.ui.Sessions;\r
+\r
+public class SessionUtil {\r
+       private static Logger logger = LogManager.getLogger();\r
+       private static final String AUTH_ENABLED = "auth_enabled";\r
+       private static final String LOCAL_USERS = "local_users";\r
+       private static final String LOCAL_ADMINS = "local_admins";\r
+       private static final String LOCAL_JOBSUBMITTERS = "local_jobsubmitters";\r
+       private static final String USERPRINCIPAL = "userPrincipal";\r
+       private static final String AUTH_LOCATION = "mediacube.auth.location";\r
+\r
+       public static boolean authenticate(String account, String password) {\r
+               Properties cfg = getConfiguration();\r
+               UserPrincipal userPrincipal = null;\r
+               if (authenticateLocal(account, password, cfg, LOCAL_ADMINS)) {\r
+                       userPrincipal = new UserPrincipal(account, true, true);\r
+               } else {\r
+                       if (authenticateLocal(account, password, cfg, LOCAL_JOBSUBMITTERS)) {\r
+                               userPrincipal = new UserPrincipal(account, false, true);\r
+                       } else {\r
+                               if (authenticateLocal(account, password, cfg, LOCAL_USERS)) {\r
+                                       userPrincipal = new UserPrincipal(account, false, false);\r
+                               } else {\r
+                                       LDAPHandler h = new LDAPHandler(account, password, cfg);\r
+                                       userPrincipal = h.getUserPrincipal();\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (userPrincipal == null)\r
+                       return false;\r
+\r
+               setAttribute(USERPRINCIPAL, userPrincipal);\r
+               return true;\r
+       }\r
+\r
+       private static boolean authenticateLocal(String account, String password, Properties cfg, String usersKey) {\r
+               if (StringUtils.isBlank(account) || account.length() < 3)\r
+                       return false;\r
+               if (StringUtils.isBlank(password) || password.length() < 3)\r
+                       return false;\r
+\r
+               String users = cfg.getProperty(usersKey);\r
+               if (StringUtils.isBlank(users) || users.length() < 7)\r
+                       return false;\r
+\r
+               return users.contains(String.format("%s:%s", account, password));\r
+       }\r
+\r
+       static public Object getAttribute(String name) {\r
+               //HttpSession session = (HttpSession) (Executions.getCurrent()).getDesktop().getSession().getNativeSession();\r
+               Session zkSession = Sessions.getCurrent();\r
+               if (zkSession == null)\r
+                       return null;\r
+               HttpSession session = (HttpSession) zkSession.getNativeSession();\r
+               if (session == null)\r
+                       return null;\r
+               return session.getAttribute(name);\r
+       }\r
+\r
+       private static Properties getConfiguration() {\r
+               Properties cfg = new Properties();\r
+               try (InputStream is = new FileInputStream(System.getProperty(AUTH_LOCATION))) {\r
+                       cfg.load(is);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               }\r
+               return cfg;\r
+       }\r
+\r
+       static public UserPrincipal getUserPrincipal() {\r
+               return (UserPrincipal) getAttribute(USERPRINCIPAL);\r
+       }\r
+\r
+       static public boolean isAdmin() {\r
+               UserPrincipal userPrincipal = getUserPrincipal();\r
+               return userPrincipal != null && userPrincipal.isAdmin();\r
+       }\r
+\r
+       static public boolean isAuthenticated() {\r
+               return !isAuthenticationEnabled() || getUserPrincipal() != null;\r
+       }\r
+\r
+       private static boolean isAuthenticationEnabled() {\r
+               boolean result = false;\r
+               try {\r
+                       Properties cfg = getConfiguration();\r
+                       result = Boolean.parseBoolean(cfg.getProperty(AUTH_ENABLED, "false"));\r
+                       if (!result)\r
+                               setAttribute(USERPRINCIPAL, new UserPrincipal("admin", true, true));\r
+               } finally {\r
+               }\r
+               return result;\r
+       }\r
+\r
+       public static void logout() {\r
+               setAttribute(SessionUtil.USERPRINCIPAL, null);\r
+       }\r
+\r
+       static public void setAttribute(String name, Object obj) {\r
+               //HttpSession session = (HttpSession) (Executions.getCurrent()).getDesktop().getSession().getNativeSession();\r
+               Session zkSession = Sessions.getCurrent();\r
+               if (zkSession == null)\r
+                       return;\r
+               HttpSession session = (HttpSession) zkSession.getNativeSession();\r
+               if (session == null)\r
+                       return;\r
+               if (session != null)\r
+                       session.setAttribute(name, obj);\r
+       }\r
+\r
+}
\ No newline at end of file
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/util/UserPrincipal.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/util/UserPrincipal.java
new file mode 100644 (file)
index 0000000..9fc4bef
--- /dev/null
@@ -0,0 +1,95 @@
+package user.jobengine.zk.util;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+import java.util.Properties;\r
+\r
+import user.commons.ListUtils;\r
+\r
+public class UserPrincipal implements java.io.Serializable {\r
+\r
+       private static final String AD_ADMIN_MAP = "ad_admin_map";\r
+       public final static String unknownUser = "";\r
+\r
+       public static boolean isValid(UserPrincipal userPrincipal) {\r
+               return (userPrincipal != null && !UserPrincipal.unknownUser.equals(userPrincipal.getAccount()));\r
+       }\r
+\r
+       private List<String> memberOf;\r
+       private boolean admin;\r
+       private boolean jobSubmitter;\r
+       private String account;\r
+       private String displayName;\r
+       private String email;\r
+\r
+       public UserPrincipal(String account) {\r
+               this.account = account;\r
+       }\r
+\r
+       public UserPrincipal(String account, boolean isAdmin, boolean isJobSubmitter) {\r
+               this.account = account;\r
+               setAdmin(isAdmin);\r
+               setJobSubmitter(isJobSubmitter);\r
+       }\r
+\r
+       public String getAccount() {\r
+               return account;\r
+       }\r
+\r
+       public String getDisplayName() {\r
+               return displayName;\r
+       }\r
+\r
+       public String getEmail() {\r
+               return email;\r
+       }\r
+\r
+       public boolean isAdmin() {\r
+               return admin;\r
+       }\r
+\r
+       public boolean isJobSubmitter() {\r
+               return jobSubmitter;\r
+       }\r
+\r
+       public void setAdmin(boolean admin) {\r
+               this.admin = admin;\r
+       }\r
+\r
+       public void setDisplayName(String displayName) {\r
+               this.displayName = displayName;\r
+       }\r
+\r
+       public void setEmail(String email) {\r
+               this.email = email;\r
+       }\r
+\r
+       public void setJobSubmitter(boolean jobSubmitter) {\r
+               this.jobSubmitter = jobSubmitter;\r
+       }\r
+\r
+       public void setMemberOf(List<String> memberOf, Properties cfg) {\r
+               this.memberOf = memberOf;\r
+               if (memberOf == null)\r
+                       return;\r
+               String adminMap = cfg.getProperty(AD_ADMIN_MAP);\r
+               if (adminMap == null)\r
+                       return;\r
+               List<String> remains = ListUtils.intersect(Arrays.asList(adminMap.split(",")), memberOf);\r
+               if (remains.size() > 0) {\r
+                       setAdmin(true);\r
+                       setJobSubmitter(true);\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public String toString() {\r
+               StringBuilder membership = new StringBuilder();\r
+               if (memberOf != null) {\r
+                       for (String group : memberOf)\r
+                               membership.append(group + " ");\r
+\r
+               }\r
+               return String.format("Display name: %s, email: %s, membership: %s", String.valueOf(displayName), String.valueOf(email), membership.toString());\r
+       }\r
+}\r
index ebbec289b772f14f4fc282d936e2226604836ea3..2737ccd1e0bebbdcf9debe634d814628ac6af735 100644 (file)
@@ -39,5 +39,4 @@ Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
 Export-Package: user.jobengine.osgi.rest,
  user.jobengine.osgi.rest.octopus,
  user.jobengine.osgi.ws.nexio
-Require-Bundle: org.jboss.resteasy.jaxrs;bundle-version="3.0.11",
- org.apache.logging.log4j.core
+Require-Bundle: org.jboss.resteasy.jaxrs;bundle-version="3.0.11"